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 ++语言没有“堆”或“堆栈”之类的东西。
自动变量具有自动存储功能。动态对象具有动态存储。静态变量具有静态存储。线程局部变量具有线程局部存储。
功能根本没有存储空间。仅对象(有时是引用)。
关于von Neumann体系结构上的C ++语言的典型实现:该程序的指令与堆栈和堆分开存储。因此,问题的答案是:都不。
函数局部变量存储在哪里?
[自动变量-即,在函数内某个块本地而不是静态的那些变量,例如f
,x
和y
被存储在自动存储器中。
在典型的实现中,通过将对象存储在执行堆栈上或CPU寄存器中,或者在任何地方(如果无法观察到它们的存储)来实现自动存储。
您的标题有点误导,因为functions]与它们的局部变量是不同的概念。
对您的问题的技术上正确的答案是取决于
,您可以查看eerorika答案以获取标准规格的详细信息。事实是,在很多特定情况下,堆和堆栈内存的概念并不是很容易定义,例如,当您在堆中分配内存并将其分配为特定线程的堆栈区域时。[如果在PC上运行示例程序,则Foo
实例(由f
指向)分配在堆上(以及它可能定义的任何成员变量,在您的示例中都没有)。 f
,x
和y
局部变量位于堆栈中。
如果您使用的是Linux平台,建议您使用GDB等调试器运行程序,并使用以下命令评估所有这些变量的地址:>
p &f p f p &x p &y
然后通过查看
/proc/1234/maps
file查找它们所属的内存区域,其中/proc/1234/maps
是程序的进程ID。您可以1234
。您会注意到,在那些区域中,有些区域包含可执行文件和几个共享库文件。那就是程序指令所在的区域,也就是函数实际所在的内存(堆栈或堆的一部分)。