2

我一直认为 List 的默认构造函数会初始化一个容量为 4 的列表,并且在添加第 5 个元素时容量会翻倍,等等......

在我的应用程序中,我制作了很多列表(树状结构,其中每个节点可以有很多子节点),其中一些节点没有任何子节点,并且由于我的应用程序速度很快但也使用了一些内存,所以我决定使用我可以指定容量并将其设置为 1 的构造函数。

现在奇怪的是,当我以容量 1 开始时,内存使用量比我使用默认构造函数时高出大约 15%。这不可能是因为 4 更适合,因为加倍是 1,2,4。那么为什么会额外增加内存使用量呢?作为一项额外的测试,我尝试从容量 4 开始。这一次,内存使用量再次比不使用指定容量时高 15%。

现在这真的不是问题,但困扰我多年的一个非常简单的数据结构有一些我还不知道的额外逻辑。有没有人知道 List 在这方面的内部运作?

4

1 回答 1

2

这是因为如果您使用默认构造函数,内部存储数组将设置为一个空数组,但如果您使用具有设定大小的构造函数,则会立即设置正确大小的数组,而不是在第一次调用 Add 时生成。

您可以使用 JustDecompile 之类的反编译器看到这一点:

public List(int capacity)
{
    if (capacity < 0)
    {
        ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.capacity, ExceptionResource.ArgumentOutOfRange_NeedNonNegNum);
    }
    this._items = new T[capacity];
}

public List()
{
    this._items = List<T>._emptyArray;
}

如果您查看 Add 函数,它会调用 EnsureCapacity,如果需要,它将扩大内部存储阵列。显然,如果最初将数组设置为空数组,则第一次添加将创建默认大小的数组。

于 2012-04-22T08:30:07.617 回答