2

Listのデフォルトのコンストラクターは、容量が4のリストを初期化し、5番目の要素を追加すると容量が2倍になるといつも思っていました...

私のアプリケーションでは、多くのリスト(各ノードが多くの子を持つことができるツリーのような構造)を作成します。これらのノードの一部には子がありません。アプリケーションは高速でしたが、使用することにしたメモリを少し使用していたためです。容量を指定してこれを1に設定できるコンストラクター。

奇妙なことに、容量1から始めたときのメモリ使用量は、デフォルトのコンストラクタを使用したときよりも約15%高くなっています。倍増は1,2,4になるので、4との適合性が高いためではありません。では、なぜこの余分なメモリ使用量の増加があるのでしょうか。追加のテストとして、容量4から始めようとしました。今回も、メモリ使用量は、指定された容量を使用しない場合よりも15%高くなりました。

これは実際には問題ではありませんが、私が何年も使用してきた非常に単純なデータ構造に、まだ知らなかった追加のロジックが含まれているのが気になります。誰かがこの側面でリストの内部の仕組みについての考えを持っていますか?

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 に答える