【发布时间】:2011-12-09 06:40:29
【问题描述】:
我理解(虽然不完全是为什么)原始类型(例如 int、float)的实例存储在堆栈中,而不是堆分配的。但是我对原始类型数组的存储和访问方式有点困惑。我有这个问题是因为 System.Array 是一个引用类型。并且引用类型是堆分配的。
int[] integers = {1,2,3,4,5};
这些单独的整数是如何在内存中存储和访问的?
【问题讨论】:
我理解(虽然不完全是为什么)原始类型(例如 int、float)的实例存储在堆栈中,而不是堆分配的。但是我对原始类型数组的存储和访问方式有点困惑。我有这个问题是因为 System.Array 是一个引用类型。并且引用类型是堆分配的。
int[] integers = {1,2,3,4,5};
这些单独的整数是如何在内存中存储和访问的?
【问题讨论】:
基本上,你的“理解”是有缺陷的。值类型值有时存储在堆栈中 - 但不是数组或任何其他基于堆的对象的一部分。不幸的是,有些人选择对存在于堆栈中的值类型做出如此笼统的陈述,这让其他人感到困惑:(
另外,the stack/heap distinction is an implementation detail...
有关更多详细信息,请参阅my article on memory,但肯定阅读 Eric Lippert 的博客文章(在上一段中链接)以了解更多哲学考虑。 (阅读他的other posts on value types 了解更多信息。)
【讨论】:
你已经发现了为什么“值类型总是存储在堆栈上”这句话显然是错误的。事实是,所存储对象的类型与其存储位置无关。正确的规则是生命周期短的值存储在短期“堆栈”的存储中,而生命周期长的值存储在长期“堆”的存储中 em>。
当你这样说时,它实际上是一个重言式。很明显短期的东西是从短期存储中分配的,而长期存在的东西是从长期存储中分配的!不然怎么可能?但是当你这样说的时候,很明显类型是无关紧要的,除非类型给你关于生命周期的提示。
整数数组的内容可能是长期存在的,因此整数是从长期存储中分配的。 int 类型的局部变量的内容通常是短期的,因此它通常是从短期存储中分配的。
【讨论】:
数组本身总是一个引用类型,所以它存储在堆上。数组的元素也存储在堆上,但总是在一个连续的内存块中。
【讨论】:
Jeffry Richter 在 2002 年写的 article 非常清楚地解释了这个概念。
【讨论】: