首页 > 解决方案 > 如果类在堆上,函数会进入堆还是堆栈?

问题描述

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++11memory-management

解决方案


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

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

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

函数根本没有存储。只有对象(有时是引用)会这样做。


关于冯诺依曼架构上 C++ 语言的典型实现:程序的指令与堆栈和堆分开存储。所以,这个问题的答案是:两者都不是。

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

自动变量 - 即那些在函数内的块本地并且不是静态的 - 例如f,xy存储在自动存储中。

在一个典型的实现中,自动存储是通过将对象存储在执行堆栈上或在 CPU 寄存器中或无处实现的(如果它们的存储不可观察)。


推荐阅读