引用类型的堆内存引用存储在哪里?

3

一个简单的示例代码:

Object test=new Object();

我知道test对象的内存是分配在堆中的。

来自MSDN的引用:

引用类型的变量存储对它们的数据(对象)的引用

但我真的不明白这个变量值(引用堆数据)存储在哪里,是存储在栈中还是堆中还是其他地方?

1个回答

5

test变量存储在栈上 - 它保存了堆上对象的地址。对象实例存储在堆上。

我建议您阅读Jeffrey Richter的.NET类型基础文章:

当从托管堆中分配对象时,new运算符返回对象的内存地址。通常将此地址存储在变量中。这称为引用类型变量,因为变量实际上不包含对象的位;相反,变量引用对象的位。

除了引用类型之外,虚拟对象系统还支持称为值类型的轻型类型。值类型对象无法分配在垃圾回收堆上,表示对象的变量不包含指向对象的指针;变量包含对象本身。由于变量包含对象,因此不必解引用指针即可操作对象。当然,这提高了性能。


感谢您的回答。您能否提供来自MSDN或其他来源的证明? - Frank59
@Frank59 在 MSDN 上很难找到关于这个的文档,但是这里有一篇不错的文章介绍了这个主题 http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_memory01122006130034PM/csharp_memory.aspx?ArticleID=9adb0e3c-b3f6-40b5-98b5-413b6d348b91 - Gusdor
@Frank59 值类型和引用类型 文章指出,变量存储在堆栈上。它还说明引用类型实例是分配在堆上的。我认为你应该看一下 Jeffrey Richter 的《CLR via C#》书籍,它非常好地描述了 CLR 内部情况。 - Sergey Berezovskiy
2
轻微更正。test并不持有堆上对象的地址,它持有指向堆上实际地址的_引用_。“用户不能将引用视为地址,事实上,它们在实现中不一定包含地址。” 引用不是地址 - mlg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接