0

我有以下课程:

public class A
{
   int i;
 }

当我创建和类对象如下:

 A obj=new A();

我可以理解对象是在堆中分配的。现在这个类得到了一个整数变量。成员变量“i”在哪里分配(在堆栈或堆中)?

4

3 回答 3

1

i是一个字段,因此它是实例本身的一部分。由于实例在堆上,并且由i... 组成,因此i在堆上。

这对于类型来说变得更加有趣struct,因为实例(值)几乎可以在任何地方,因此i可以在任何地方。您只能说“在实例内部”。

于 2012-11-29T16:08:38.930 回答
1

成员变量“i”在哪里分配(在堆栈或堆中)?

它在堆上——它是对象内存的一部分。(如果变量最终没有成为对象数据的一部分,您希望对象的数据由什么组成?)

当然,正如 Eric Lippert 所指出的,堆栈是一个实现细节(第一部分[part two][2])。通常你不应该太担心它。在实践中,越来越多的局部变量开始在堆上分配:

  • 迭代器块
  • 为匿名函数捕获的变量
  • 异步方法

我还没有看到太多相反的证据,尽管未来的 CLR 可能会使用转义分析来证明特定对象永远不必堆上分配,而是在堆栈上分配。(我相信一些 JVM 会这样做。)

于 2012-11-29T16:08:55.380 回答
0

所有类成员都将进入堆并继续分配内存。方法中的所有变量(局部变量)都分配在堆栈上。

于 2013-10-01T15:20:58.817 回答