.net框架中值类型和引用类型的内存分配

是否有一篇高级文章,我可以阅读,可以解释如何在.net框架中为不同类型(值和参考)分配内存。

例如我们知道值类型在堆栈上分配空间,但是如何管理?

另外如何在堆中管理引用类型以及存储实际值的位置。 (像任何类的引用类型将包含许多值类型,它们在哪里被保存以及它们如何被管理)


这比你想象的要复杂得多。 即使你声称“价值类型分配在堆栈上”也是不正确的。 例如:

class Foo
{
    int x;
}

int是一个值类型,但是x的值将始终在堆上,因为它将与Foo实例的其余数据一起存储,这是一个类。

此外,匿名函数和迭代器块的捕获变量会使生活更加棘手。

我有一篇关于C#堆/栈内存的文章,您可能会发现它很有用,但是您也可能想阅读Eric Lippert的博客文章“堆栈是一个实现细节”。 特别是,未来的C#编译器可以决定将所有局部变量存储在堆中,使用堆栈来保存对在方法开始时创建的实例的引用......这不会违反C#规范所有。


值类型是“已分配”的地方。

这意味着什么取决于你在哪里定义它:

  • 在类/结构体中,作为该结构体中的字段,放大内存中的类/结构体以适应其中的值类型值
  • 作为方法中的一个局部变量,堆栈中,寄存器或生成类中的字段(使用“闭包”时),取决于优化
  • 作为方法的参数,在堆栈上或作为寄存器,取决于优化
  • 参考类型是一种双重价值。 引用类型的核心是一个指针,指针值遵循与“值”类型相同的“分配”规则,但是一旦存储了值,即。 对某个对象的引用,该对象位于其他地方的堆上。

    换句话说,引用变量本身是“分配”的值类型,但它引用的对象位于堆上。

    当你从一个类构造一个对象时,空间被分配到堆上,以适应该类的所有字段+该空间中的一些开销。

    我似乎回忆起Jon Skeet写了一篇关于这个话题的文章,我相信他很快就会回答一个答案,敬请关注。


    这篇文章看起来很先进,不会过分。 它应该为您提供更好的理解:

    http://www.simple-talk.com/dotnet/.net-framework/understanding-garbage-collection-in-.net/

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

    上一篇: memory allocation of value types and reference types in .net framework

    下一篇: C stack allocation size