列出<long> vs long [],内存使用</long>

时间:2011-12-11 16:30:58

标签: c# .net memory

关于

的内存大小
List<long> ListOfLongs;
long[] ArrayOfLongs;

如果每个元素都有N个元素,那么它们会占用多少内存?

我问这是因为据我所知,.NET没有模板(泛型)专业化。

4 个答案:

答案 0 :(得分:10)

实际上相同数量的内存(从技术上讲,List可能会消耗更多内存,因为它已经过度分配,因此它可以更容易增长。)

.NET中的通用集合不需要打包它们所拥有的项目,这将是一个巨大的内存和性能接收器。

答案 1 :(得分:5)

List<T>拥有数组T[]。它对此数组使用指数增长策略,因此包含n元素的列表通常具有大小大于n的支持数组。此外,较小的阵列需要进行垃圾收集,如果它们足够大,可以在LoH上使用,这可能很烦人。

但您可以通过手动指定容量来避免这种情况,例如作为构造函数参数。然后将分配具有所需容量的单个阵列,以避免上述两个问题。

此外,List<T>对列表对象本身有一个小的O(1)开销。


但是使用泛型时没有每个元素的开销。运行时为您传入的每个值类型创建一个专用版本。不会对元素进行装箱。

但是你不能使用C ++样式模板专门化,你可以有效地重载某些类型参数的实现。所有通用实例都共享相同的C#代码。

即。没有专门的IL代码,但每种值类型都基于相同的源代码获得专门的机器代码实现。

答案 2 :(得分:1)

  

我问这是因为据我所知,.NET没有模板(泛型)专业化。

.Net没有模板专业化,因为您(作为程序员)可以根据类型参数提供不同的代码。但是编译器仍然可以(并且确实)为值类型生成与引用类型不同的代码,即(与Java不同)值类型在放入通用容器时不会被加框。它们被有效存储。

答案 3 :(得分:1)

使用列表比使用普通数组更实用。性能和内存消耗的关键是列表的容量。默认情况下,只要列表的元素达到定义的容量,它就会以值4开始并增加到8,16,32,64 .......每个增量都转换为内部重新分配和Array.Copy。因此,如果您有一个包含1000个项目的列表,并且您希望一天中有100个项目,则可以实例化容量为1200的列表(预测误差范围为100%)。这样,无论何时添加10001项目,您都将避免重新分配2000个项目,当然还有连续的重新分配和Array.Copy,以便用现有的1000个项目填充它。