我理解(不完全是为什么)原始类型的实例(如int,float)存储在堆栈中而不是堆分配的。但我对如何存储和访问基元类型的数组感到困惑。我有这个问题,因为System.Array是一个引用类型。引用类型是堆分配的。
int[] integers = {1,2,3,4,5};
如何在内存中存储和访问这些单独的整数?
答案 0 :(得分:10)
你的“理解”基本上是有缺陷的。值类型值有时存储在堆栈中 - 但不是在数组的一部分或任何其他基于堆的对象时。不幸的是,有些人选择围绕生活在堆栈上的价值类型做出如此全面的陈述,这会使其他人感到困惑:(
此外,the stack/heap distinction is an implementation detail ...
有关更多详细信息,请参阅my article on memory,但肯定会阅读Eric Lippert的博客文章(在上一段中链接),以了解更多哲学注意事项。 (阅读他的other posts on value types以获取更多信息。)
答案 1 :(得分:10)
您已经发现了“值类型始终存储在堆栈中”的语句显然是错误的原因。事实是存储对象的类型与存储的位置无关。正确的规则是具有较短生命周期的值从短期“堆栈”存储在存储中和值,长寿命存储在长期“堆”的存储中
当你这样说时,它实际上是一个重言式。显然,短期商店会分配短命的东西,并且从长寿店分配长寿的东西!怎么会这样呢?但是当你这样说时,显然这种类型是无关紧要的,除非类型给你一个关于生命的提示。
int数组的内容可能是长期存在的,因此int将从长期存储中分配。 int类型的局部变量的内容通常是短暂的,因此通常从短期存储中分配。
答案 2 :(得分:1)
数组本身始终是引用类型,因此它存储在堆上。数组的元素也存储在堆上,但总是存在于连续的内存块中。
答案 3 :(得分:1)
Jeffry Richter在2002年写的article非常清楚地解释了这个概念。