如果类在堆上,函数会进入堆还是堆栈?

问题描述 投票:2回答:2
class Foo{

    public:
        void foo(){
            int x, y; // go to the HEAP or the stack?
        }
};

int main(){
    Foo *f = new Foo();
    f -> foo();

    delete f;
}

如果我在HEAP上创建一个类实例并激活一个“类方法”,函数局部变量和“元数据”存储在哪里?在HEAP上,因为该类在HEAP或堆栈上?

c++ c++11 memory-management
2个回答
3
投票

如果类在堆上,函数会进入堆还是堆栈?

C ++语言没有“堆”或“堆栈”之类的东西。

自动变量具有自动存储功能。动态对象具有动态存储。静态变量具有静态存储。线程局部变量具有线程局部存储。

功能根本没有存储空间。仅对象(有时是引用)。


关于von Neumann体系结构上的C ++语言的典型实现:该程序的指令与堆栈和堆分开存储。因此,问题的答案是:都不。

函数局部变量存储在哪里?

[自动变量-即,在函数内某个块本地而不是静态的那些变量,例如fxy被存储在自动存储器中。

在典型的实现中,通过将对象存储在执行堆栈上或CPU寄存器中,或者在任何地方(如果无法观察到它们的存储)来实现自动存储。


1
投票

您的标题有点误导,因为functions]与它们的局部变量是不同的概念。

对您的问题的技术上正确的答案是取决于

,您可以查看eerorika答案以获取标准规格的详细信息。事实是,在很多特定情况下,堆和堆栈内存的概念并不是很容易定义,例如,当您在堆中分配内存并将其分配为特定线程的堆栈区域时。

[如果在PC上运行示例程序,则Foo实例(由f指向)分配在堆上(以及它可能定义的任何成员变量,在您的示例中都没有)。 fxy局部变量位于堆栈中。

如果您使用的是Linux平台,建议您使用GDB等调试器运行程序,并使用以下命令评估所有这些变量的地址:>

p &f
p f
p &x
p &y

然后通过查看/proc/1234/maps file查找它们所属的内存区域,其中/proc/1234/maps是程序的进程ID。您可以1234

您会注意到,在那些区域中,有些区域包含可执行文件和几个共享库文件。那就是程序指令所在的区域,也就是函数实际所在的内存(堆栈或堆的一部分)。

© www.soinside.com 2019 - 2024. All rights reserved.