4

可能重复:
为什么结构存储在堆栈上,而类存储在堆(.NET)上?

谁能告诉我内存分配是如何完成的,哪个对象存储在堆栈中,哪个对象存储在内存的堆部分?

4

2 回答 2

12

在 C# 编译器和 CLR 的 Microsoft 实现中,当值是临时值、局部变量或形参,既不是匿名方法的封闭外部变量也不是迭代器块时,值类型存储在堆栈中.

当然,如果不需要,为什么要在堆栈上存储东西呢?一些值类型的局部变量根本就不会入栈;他们一生都在登记册中。

值类型的其他值存储在堆装箱值类型上,值类型字段存储在引用类型上,等等。

当然,值类型既不能存储在堆栈上,也不能存储在寄存器上,也不能存储在托管堆上;它们可以使用不受 CLR 控制的完全其他内存管理器存储在非托管内存中。

(当然请注意,在“堆栈”中使用“the”会产生微妙的误导;一个进程中可能有很多堆栈。不一定只有一个。)

所有这些都是实施细节,如有更改,恕不另行通知。

此外,显然使用堆栈分配声明分配的东西是在堆栈上分配的。

有关此主题的更多信息,请参阅我的文章:

http://blogs.msdn.com/b/ericlippert/archive/2009/04/27/the-stack-is-an-implementation-detail.aspx

http://blogs.msdn.com/b/ericlippert/archive/2009/05/04/the-stack-is-an-implementation-detail-part-two.aspx

你为什么在乎?运行时为您管理所有这些细节,因此您不必担心。你只是好奇,还是这会导致一些更大的问题?

于 2010-09-16T13:54:13.423 回答
5

3条经验法则:

  1. 对象存储在堆上。这些包括引用类型和装箱值类型的实例。
  2. 局部变量和参数存储在堆栈中。对于本地值类型,这意味着值本身存储在堆栈中。对于局部引用类型,只有引用将在堆栈上(编辑:Eric Lippert 指出的异常 - 值类型局部变量关闭外部变量,迭代器块值类型)。
  3. 字段存储在包含实例所在的位置。例如,一个类的值类型字段将存储在堆上。声明为本地存储在堆栈上的结构的引用类型字段的引用部分也将在堆栈上。
于 2010-09-16T13:55:06.450 回答