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;
}
如果我在堆上创建一个类实例并激活一个“类方法”,函数局部变量和“元数据”存储在哪里?它们存储在堆上,因为类在堆上或者栈上都可以。
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;
}
f
,x
和y
,存储在自动存储中。new
关键字,数据将存储在堆中,那么“C++语言没有堆或栈”是什么意思? - dsal3389new
创建具有动态存储期的对象。虽然关于它的部分标题为“自由存储区”,但C++标准并未描述动态对象的内存来自何处,这是同堆栈相似的。一些人不建议将“堆”用作此未使用内存的名称,因为与数据结构称为堆的名称冲突,而该数据结构与之无关。 - eerorika你的标题有些误导,因为"函数"与它们的局部变量是不同的概念。
对于你的问题来说,技术上的正确答案是"这要看情况",你可以查看eerorika的回答以获取标准规范的细节。问题在于,有许多特定的场景,堆内存和栈内存的概念并不容易定义,例如当你在堆中分配内存并将其赋值为特定线程的栈区域时。
如果你在电脑上运行你的示例程序,则Foo
实例(由f
指向)分配在堆上(还有任何成员变量,在你的示例中没有)。f
、x
和y
局部变量位于栈中。
如果你正在使用Linux平台,我建议你使用类似GDB的调试器运行你的程序,并评估所有这些变量的地址。
p &f
p f
p &x
p &y
/proc/1234/maps
文件,其中1234
是您程序的进程ID,寻找它们所属的内存区域。您也可以向gdb询问。您会注意到,在这些区域中,有一些包含可执行文件和几个共享库文件的区域。那将是程序指令所在的区域,也就是函数实际位于的内存(既不是堆栈的一部分,也不是堆的一部分)。
void Foo::foo()
看作是几乎等同于void ::foo(Foo* obj)
。 - Bathshebax
和y
就不会存在了,因为编译器很可能会优化它们的存在。通常情况下,它可能会将它们存储在_寄存器_或堆栈中。 - Daniel Langr