我有以下课程:
public class A
{
int i;
}
当我创建和类对象如下:
A obj=new A();
我可以理解对象是在堆中分配的。现在这个类得到了一个整数变量。成员变量“i”在哪里分配(在堆栈或堆中)?
我有以下课程:
public class A
{
int i;
}
当我创建和类对象如下:
A obj=new A();
我可以理解对象是在堆中分配的。现在这个类得到了一个整数变量。成员变量“i”在哪里分配(在堆栈或堆中)?
i
是一个字段,因此它是实例本身的一部分。由于实例在堆上,并且由i
... 组成,因此i
在堆上。
这对于类型来说变得更加有趣struct
,因为实例(值)几乎可以在任何地方,因此i
可以在任何地方。您只能说“在实例内部”。
成员变量“i”在哪里分配(在堆栈或堆中)?
它在堆上——它是对象内存的一部分。(如果变量最终没有成为对象数据的一部分,您希望对象的数据由什么组成?)
当然,正如 Eric Lippert 所指出的,堆栈是一个实现细节(第一部分;[part two][2]
)。通常你不应该太担心它。在实践中,越来越多的局部变量开始在堆上分配:
我还没有看到太多相反的证据,尽管未来的 CLR 可能会使用转义分析来证明特定对象永远不必在堆上分配,而是在堆栈上分配。(我相信一些 JVM 会这样做。)
所有类成员都将进入堆并继续分配内存。方法中的所有变量(局部变量)都分配在堆栈上。