2016-08-24 13 views
2

は、以下の2行のコードを実行する間に違いがあります:リスト<Class>()(0)

IList<Class> list = new List<Class>(); 

IList<Class> list = new List<Class>(0); 

私が言われてきた、第一、キャパシティ少ないコンストラクタは、0の容量を持つコンストラクタに比べて少ないメモリを割り当てるため、より効果的です。私はMSDNを検索しましたが、リストのデフォルト容量は0ですが、これには何の論理も見当たりません。

誰でもこの理論を確認することはできますか?

+3

参考ソースを見ましたか? http://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs,cf7f4095e4de7646 –

+3

「x = a」と「私はMSDN_を検索しました」と最初に言われました。前記「x = b」と述べた。どちらが正しいか? –

答えて

8

あなた自身のために見ることができるようにあなたが実際に

public List(int capacity) { 
    if (capacity < 0) ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.capacity, ExceptionResource.ArgumentOutOfRange_NeedNonNegNum); 
    Contract.EndContractBlock(); 

    if (capacity == 0) 
    _items = _emptyArray; 
    else 
    _items = new T[capacity]; 
} 

http://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs,cf7f4095e4de7646

public List() { 
    _items = _emptyArray; 
} 

の助けを借りて、かなり簡単に質問に答えることができます。何も初期容量が供給されていない場合は、内部(ctor()_items配列は_emptyArrayに設定されます。これはctor(0)と同じ動作です。空の配列の(余分な)割り当てを避けるために、これはすべてのctor(0)呼び出しの内部最適化のようです。

最後に、上記のctor-callのどちらも、実際の初期容量に比べて実際にはメモリ効果がありません。これは、それに応じて動的に拡張される非常にデータ構造の性質です。実際の容量を知っているときはいつでも、ctor(capacity)に電話をかけてサイズ変更を避けてください(hereが実装され、すべての書き込みで呼び出されます)。

+0

一言で言えば、それは何の違いもありません(いくつかの追加チェックは除きますが、それはまったく無視できます)。 – Heinzi

+2

コアCLRの場合:https://github.com/dotnet/coreclr/blob/775003a4c72f0acc37eab84628fcef541533ba4e/src/mscorlib/src/System/Collections/Generic/List.cs –

+3

Hm。実際には、あなたの調査によると、 'new List()'は引数チェックをスキップして 'new List(0)'よりも少し速くなっています。誰かが本当にニットピッキングしていると、 'List()'はスタック上のスペースが少なくて済むので、メモリは少なくなります。しかし、私はそのような人ともっと議論したくありません悪い気分 – quetzalcoatl

関連する問題