MOZ*_*LLA 4 .net memory-management
是否有一篇我可以阅读的高级文章可以解释如何在.net框架中为不同类型(值和引用)分配内存.
例如,我们知道值类型是在堆栈上分配空间,但是如何管理?
如何在堆中管理引用类型以及存储实际值的位置.(像任何类一样的引用类型将包含许多值类型,它们保存在哪里以及如何管理它们)
Jon*_*eet 10
这比你想象的要复杂得多.甚至你声称"值类型在堆栈上分配"也是不正确的.例如:
class Foo
{
int x;
}
Run Code Online (Sandbox Code Playgroud)
int 是一个值类型,但x的值将始终在堆上,因为它将与Foo实例的其余数据一起存储,这是一个类.
此外,匿名函数和迭代器块的捕获变量使生活变得更加棘手.
我有一篇关于C#堆/堆内存的文章,你可能会觉得有用,但你可能还想阅读Eric Lippert关于"堆栈是一个实现细节"的博客文章.特别是,未来的C#编译器可以决定将所有局部变量存储在堆上,使用堆栈只是为了保存对在方法开始时创建的实例的引用...这不会违反C#规范所有.
当调用方法时,值类型所需的空间量是预先知道的(可以由编译器计算)。该空间在堆栈上分配,并且仅在方法调用期间可用。对于每个新方法调用,堆栈上使用的内存都会增加,并且当该方法退出时,它会收缩回之前的级别。
引用类型在堆上分配。堆基本上是用于此目的的一块内存。存储在堆上的对象主要是存储在分配给该对象的内存中的对象字段。因此,值类型字段存储在堆上对象的“内部”。引用类型字段存储为对所引用对象的引用(或指针)。堆上的内存由垃圾收集来管理。这是一个复杂的主题,但简短的故事是,分配给堆上未使用对象的内存被释放,因此可以由垃圾收集器定期重用。
| 归档时间: |
|
| 查看次数: |
8465 次 |
| 最近记录: |