堆栈和堆在c锐利

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

任何人都可以告诉我如何分配内存以确定哪个对象存储在堆栈中以及哪些对象存储在内存的堆部分中?

3条经验法则:

  1. 对象存储在堆上 。 这些包括引用类型和盒装值类型的实例。
  2. 局部变量和参数存储在堆栈中 。 对于本地值类型,这意味着值本身存储在堆栈中。 对于本地引用类型,只有引用将在堆栈上(编辑:Eric Lippert注释的例外 – 值类型本地关闭外部变量,迭代器块值类型)。
  3. 字段存储在包含实例所在的位置 。 例如,类的值类型字段将存储在堆上。 声明为存储在堆栈中的本地结构的引用类型字段的引用部分也将在堆栈上。

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

当然,如果你不需要,为什么要把东西存放在堆栈上呢? 一些值类型的局部变量永远不会进入堆栈; 他们一生都在寄存处。

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

值类型当然既不存储在堆栈中,也不存储在寄存器中,也不存储在托管堆中; 它们可以使用一些完全不受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

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