List< long>Vs long[],内存使用情况

本文关键字:long 内存 用情 情况 Vs List | 更新日期: 2023-09-27 18:17:25

关于

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

如果每个元素有N个元素,它们消耗了多少内存?

我问这个问题是因为据我所知,. net没有模板(泛型)专门化

List< long>Vs long[],内存使用情况

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

. net中的泛型集合不需要将它们所持有的项框起来,否则会占用大量的内存和性能。

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

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

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


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

但是你不能使用c++风格的模板专门化,因为这样你可以有效地重载特定类型参数的实现。所有泛型实例化共享相同的c#代码。

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

我问这个问题是因为据我所知,. net没有模板(泛型)专门化。

。Net没有模板专门化,也就是说,您(作为程序员)可以根据类型参数提供不同的代码。但是编译器仍然可以(并且确实)为值类型生成与引用类型不同的代码,即(与Java不同)值类型在放入泛型容器时不被装箱。

使用列表比使用普通数组更实用。性能和内存消耗的关键是列表的容量。默认情况下,从4开始,依次递增到8、16、32、64、…当列表中的元素达到定义的容量时。每个增量都转换为内部重新分配和Array.Copy。因此,如果您有一个包含1000个项目的列表,并且您预计每天有100个项目,那么您可以实例化容量为1200的列表(预测误差范围为100%)。这样就可以避免在添加10001项时对2000项进行重新分配,当然还可以避免连续地对Array进行重新分配。复制并填充现有的1000个条目