对象中的值类型也存储在堆中?

Posted

技术标签:

【中文标题】对象中的值类型也存储在堆中?【英文标题】:Value types in object stored in heap as well? 【发布时间】:2011-06-11 07:19:09 【问题描述】:

我可以想象这个问题已经被问了数千次,但我没有太多运气找到答案,而且这更多是出于好奇而不是需要。

深入研究 C# 的具体细节,我想知道既然对象存储在堆中,那么对象中的值类型是否也存储在堆中还是放在堆栈中?

【问题讨论】:

【参考方案1】:

它们与对象本身一起存储在堆上。考虑这一点的一个好方法是,当在堆上分配一个对象(将值类型作为其状态的一部分)时,它的值类型也必须在那里,否则一旦堆栈展开,这些值类型就会消失用于创建对象的代码。

【讨论】:

【参考方案2】:

是的,它们作为堆的一部分存储。然而,正如 Eric Lippert 多次描述的那样,这都是一个实现细节。我建议你阅读他的博客文章,this 是最新的,these two 也很重要。

【讨论】:

好文章,谢谢!顺便说一句,喜欢你的书,恰好现在正在阅读!【参考方案3】:

它们存储在堆中,在为引用类型分配的内存中。另外,value types are often stored in places other than "the stack"。但是,CLI 规范没有指定存储值类型的内存池所在的位置 - 这是一个无关紧要的实现细节。

【讨论】:

【参考方案4】:

安德鲁·黑尔是对的。详情请见Eric Lippert's blog entry:

我对“值类型在堆栈上”的神话感到不安......它通常被错误地表述:该语句应该是“值类型可以存储在堆栈上”,而不是更常见的“值类型始终存储在堆栈中”。

【讨论】:

以上是关于对象中的值类型也存储在堆中?的主要内容,如果未能解决你的问题,请参考以下文章

js按值传递和按引用传递

面向对象--03值类型和引用类型

值类型数组如何存储在 .NET 对象堆中?

值类型与引用类型

Java中数组对象的存储位置?

JavaScript中基本数据类型和引用数据类型的区别