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

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

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

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

从这里我有2个问题


  1. 我知道在4,8,16 …插入项目到列表后 – 该列表在内存中reallocate自己。

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

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

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

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

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

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

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

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

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

两者都是连续存储的,但在第二种情况(类)中,您存储了对类实例的引用列表。

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

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