C# Int32类型的ArrayList如何能大于Int32类型的List

C# Int32类型的ArrayList如何能大于Int32类型的List,c#,.net,generics,C#,.net,Generics,我有一个任务,其中包括在创建泛型类型的实例时解释以下结果ArrayList和List ArrayList de Int32 = 280 ns ; 1.603.604 bytes List<Int32> = 59 ns ; 408.224 bytes ArrayList de String = 77 ns ; 408.224 bytes List<String> = 74 ns ; 408.224 bytes ArrayList de Int32=280纳秒;1.

我有一个任务,其中包括在创建泛型类型的实例时解释以下结果
ArrayList
List

ArrayList de Int32 = 280 ns ; 1.603.604 bytes   
List<Int32> = 59 ns ; 408.224 bytes 
ArrayList de String = 77 ns ; 408.224 bytes
List<String> = 74 ns ; 408.224 bytes
ArrayList de Int32=280纳秒;1.603.604字节
列表=59纳秒;408.224字节
ArrayList de String=77纳秒;408.224字节
列表=74纳秒;408.224字节
我花了相当多的时间试图弄明白这一点,又花了相当多的时间试图在互联网上找到一些东西,但什么都没有


提前感谢:)

我认为要求解决作业是不合适的。另一方面,我认为这个作业很愚蠢,因为你要么在某处读到了差异,要么没有读到泛型在.NET中是如何工作的,所以我想我还是会回答的

ArrayList不是泛型的,这意味着它包含一个对象数组。每个int都应该被装箱到一个对象中,该对象将实际的4字节数据添加12字节(我认为一个对象的开销是12字节,但我可能会减少几个字节)。这是在对象中包装int的内存开销。包装和展开也需要CPU时间成本。另一方面,列表或任何值类型都是专用的。这意味着CLR为ints生成一个特殊版本的列表。内部数组是一个int数组,而不是对象数组,因此数据不会丢失额外的内存。由于未执行装箱和取消装箱,因此时间也有所提高。请注意,附加对象对GC施加压力,GC必须在某个点收集这些对象

对于字符串没有惩罚,因为字符串是引用类型,所以它们的工作方式基本上与对象相同。它们已经包含了12字节的开销。在强制转换时检查类型可能会有一些CPU开销,但不会执行昂贵的装箱。这就是泛型列表和ArrayList在性能和内存方面没有显著差异的原因


同样值得注意的是,这个方法并不是泛型在所有语言中都是如何工作的。例如,Java非常不同,所以如果您使用一些非.NET技术,请务必检查您的知识是否适用。

我想拳击会带来这种变化。发布代码,以便我们可以看到您的测试做了什么。
ArrayList
不是泛型类型。因此,对于像Int32这样的valuetype项目,装箱将对运行时产生很大影响。我没有代码,只给出了输出……我真不明白为什么有人否决了这个问题。虽然它可能是复制品,但要求它的人很难知道它是复制品。甚至可以说,它的不同程度足以不被认为是所提出问题的重复。感谢您的回答,此赋值确实令人困惑……在64位系统中,对象包装器应该占用16个字节(8个字节用于类型指针,指向
System.object
,8个字节用于同步块指针)。将整数的32位相加。将数组指针添加到已装箱的整数,即28字节。因此,
列表
每个整数需要4个字节,而
数组列表
需要28个字节。@dcastro似乎是在32位上进行测试,因为数组列表版本只占用4倍的空间。@Stilgar是的,在32位系统上,装箱整数加上它的指针将占用16个字节(4表示类型指针,4表示同步块指针,4表示实际整数,4表示指向已装箱整数的指针),这是未装箱整数大小的4倍。