类的成员的内存分配

时间:2012-11-29 16:05:12

标签: .net

我的课程如下:

public class A
{
   int i;
 }

当我创建类的对象时如下:

 A obj=new A();

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

3 个答案:

答案 0 :(得分:1)

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

这对struct类型来说更有趣,因为实例(值)可以在任何地方,因此i可以在任何地方。你只能说“在实例中”。

答案 1 :(得分:1)

  

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

它在堆上 - 它是对象内存的一部分。 (如果变量最终作为对象数据的一部分,您希望对象的数据包含哪些内容?)

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

  • Iterator blocks
  • 匿名函数的捕获变量
  • 异步方法

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

答案 2 :(得分:0)

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