堆叠和堆在C锐利

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

任何人都可以告诉我内存的分配是如何完成的:哪个对象将被存储在堆栈中,哪个对象位于内存的堆部分?


3经验法则:

  • 对象存储在堆上 。 这些包括引用类型和装箱值类型的实例。
  • 局部变量和参数存储在堆栈中 。 对于本地值类型,这意味着该值本身存储在堆栈中。 对于本地引用类型,只有引用会出现在堆栈上(编辑:由Eric Lippert记录的异常 - 值类型局部关闭于外部变量,迭代器块值类型)。
  • 字段存储在包含实例的位置 。 例如,一个类的值类型字段将被存储在堆上。 声明为本地存储在堆栈中的结构的引用类型字段的引用部分也将位于堆栈上。

  • 在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

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

    链接地址: http://www.djcxy.com/p/82711.html

    上一篇: Stack and heap in c sharp

    下一篇: Passing a stack allocated argument by reference to an array