如何解释堆和堆栈不会相互增长

时间:2011-11-16 15:14:36

标签: .net stack heap

当我调试这些代码行时,我可以观察到ms / ms2是值类型的实例,它们是在堆栈上分配的,而o(盒装MyStruct实例)是引用类型,并在托管堆中分配。

我可以在Visual Studio的Watch窗口中查看ms和ms2的地址,它们分别是0x0024f104和0x0024f0f0。因此,堆栈向地址空间的底部向下增长。由于堆栈和堆相互增长,托管堆的地址区域应低于0x0024f0f0。但是o的地址实际上是0x01e9312c,这意味着堆不会向堆栈增长(尽管我可以观察到在堆中分配新对象时,它们的地址确实在增长)。

有人可以帮忙解释一下吗?

MyStruct ms = new MyStruct(1, 2, 4, 8); //0x0024f104, 16 bytes for ms
Object o = ms;                          //0x0024f100, 4 bytes for variable o
MyStruct ms2 = (MyStruct)o;             //0x0024f0f0, 16 bytes for ms2

1 个答案:

答案 0 :(得分:1)

堆叠和头部朝向彼此生长是一个有效的概念大约30年前。

通常,您不必也不应该关心对象所在的内存位置。