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

Dan*_*dor 6 .net c# memory

关于内存的大小

List<long> ListOfLongs;
long[] ArrayOfLongs;
Run Code Online (Sandbox Code Playgroud)

如果每个都有N个元素,他们吃了多少内存?

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

Jon*_*Jon 10

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

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

  • 你想说List <>在实现方面是一个数组吗? (3认同)
  • @Daniel:是的,一个可以成长的阵列. (2认同)

Cod*_*aos 5

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

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

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


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

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

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