2016-08-24 5 views
2

Есть ли разница между выполнением этих двух строк кода:Список <Class>() против Список <Class> (0)

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

и

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

Я сказал, что первое, наращивание менее конструктор более эффективен, поскольку он выделяет меньше памяти по сравнению с конструктором с емкостью 0. Я искал MSDN, и там написано, что емкость по умолчанию для List равна 0, и я не вижу в этом никакой логики ...

Может ли кто-нибудь подтвердить или опровергнуть эту теорию?

+3

Вы посмотрели источник ссылки ?! http://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs,cf7f4095e4de7646 –

+3

«Мне сказали сначала», что «x = a», затем «_Is search MSDN_», и это сказал 'x = b'. Какой из них правильный? –

ответ

8

Вы действительно можете ответить на этот вопрос довольно легко с помощью http://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs,cf7f4095e4de7646

public List() { 
    _items = _emptyArray; 
} 

против

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]; 
} 

Как вы можете видеть сами: Если не первоначальная мощность не подается (ctor()) внутренний _items массив установлен на _emptyArray, что аналогично поведению для ctor(0). Это выглядит как внутренняя оптимизация для всех ctor(0)-колл, чтобы избежать (лишних) распределений пустого массива.

В конце концов, ни один из приведенных выше вызовов ctor действительно эффективен с точки зрения памяти по сравнению с реальной начальной пропускной способностью. Это характер самой структуры данных, которая динамически распространяется соответственно. Поэтому, когда вы знаете реальную пропускную способность, вы должны позвонить ctor(capacity), чтобы избежать изменения размера (которое реализовано here и вызвано для каждой записи).

+0

Итак, в двух словах, это не имеет никакого значения (за исключением нескольких дополнительных проверок, которые совершенно ничтожны). – Heinzi

+2

для того же самого в core-clr: https://github.com/dotnet/coreclr/blob/775003a4c72f0acc37eab84628fcef541533ba4e/src/mscorlib/src/System/Collections/Generic/List.cs –

+3

Hm. Фактически, ваши исследования показывают, что 'new List()' немного быстрее, чем 'new List (0)' из-за пропуска проверки аргументов. Если кто-то действительно выбирает nit, то можно сказать, что 'List()' занимает меньше места в стеке, поэтому он «использует меньше памяти» .. но я не хотел бы обсуждать его дальше с человеком в таком плохое настроение – quetzalcoatl

Смежные вопросы