连续内存存储误解在.NET?

时间:2012-02-07 21:06:26

标签: c# .net arrays generics memory-management

http://msdn.microsoft.com/en-us/library/ms379570(v=vs.80).aspx

我知道Arrays中的.net连续方式存储。 (在mem中)

我也知道List<..>不是。 (好吧......不是所有列表类型......请参阅我的第2个问题)

从这里我有2个问题


  1. 我知道在4,8,16 ...插入项目到列表后 - 列表reallocate本身就在内存中。

    我也知道我可以将Capacity发送给他,以便让他知道我将创建他的大小(以减少重新分配)。

    问题是为什么?他不会连续存放自己,为什么他关心重新 分配自己? (他不必找到免费和连续的存储单元)

  2. 为什么带有结构的List是否在连续内存中分配,与类列表不同?

2 个答案:

答案 0 :(得分:21)

List<T>会连续存储内存。在内部,它使用数组进行存储。达到容量后,将分配一个新数组并复制内存。

对于类或结构的List<T>实例,这是正确的。但是,当T是引用类型(类)时,您将存储连续的引用列表。类实例不能是连续的,因为您可以包含一个列表,其中包含对类的同一实例的100个引用。

因此,要解决您的具体问题:

  

问题是为什么?他不会连续存放自己,为什么他会关心重新分配自己呢?

连续存储项目,这就是重新分配的原因。

  

为什么带有结构的List是否在连续内存中分配,与类列表不同?

两者都是连续存储的,但在第二种情况下(类),你要存储一个对类实例的引用列表。

答案 1 :(得分:0)

1)所有对象引用仍然是有条不紊地存储

2)列表och类仍然必须让对象像普通对象一样存储。不能强制进入一个有名的阵列 - 但是对它们的引用可以