哪些值类型存储在(C#)通用集合中

Cur*_*ser 11 .net c# generics types

确实,泛型集合比值类型的非泛型集合表现更好.(即List与ArrayList).

但除了拳击拆箱步骤之外,为什么呢?一旦添加到集合中,值类型对象存储在哪里?在非泛型集合中,它们将被装箱并存储在堆上,泛型中有什么不同?

Ree*_*sey 13

在泛型中,例如List<T>,它们仍然存储在堆上.区别在于,在内部,a List<int>生成一个整数数组,并且可以直接存储数字.使用ArrayList,您最终会存储对盒装整数值的引用数组.


Han*_*ant 8

相关的实现细节是a的底层存储List<T>是T [].因此,对于一个List<int>值,将存储在int []中.整数存储在连续的内存块中,从垃圾收集堆中分配.

使它如此快速的原因不仅仅是整数没有盒装,而是int []在CPU缓存中运行得非常好.当您读取第一个元素时,您基本上可以免费获得下一个15,而无需读取慢速RAM或二级缓存.这对于盒装int来说效果不是很好,因为它太大而且额外的引用可能具有较差的缓存局部性.但是,垃圾收集器真的有助于通过压缩堆来消除成本.


Jam*_*ran 1

ArrayList 是对存储在堆中的对象的引用的本地数组。

引用类型的通用列表是对存储在堆中的对象的引用的本地数组。

值类型的通用列表是这些值类型的本地数组。

有两个内存区域,大多数参考文献将其称为“堆栈”和“堆”。大多数使用这些术语的人不知道为什么。(“堆栈”可能是堆栈,但堆几乎肯定不是堆)。我更喜欢“这边”和“那边”这两个词。装箱后,值类型数据存储在“那边”。当存储在数组中(可能在通用列表中)时,值类型数据存储在“Over Here”。“在这里”更好。

  • 好吧,那么你的说法不正确(如果你指的是常用意义上的堆栈)。`ArrayList` 和 `List&lt;T&gt;` 都使用 System.Array 作为内部存储,它是引用类型并存储在“那边”。 (2认同)