Чтобы понять, почему он больше, вам нужно понять, как List<T>
работает внутри. Внутри List<T>
использует массив (поэтому T[]
) для хранения его содержимого.
Этот массив начинается с размера 4 элемента, что эквивалентно высказыванию T[] array = new T[4]
. Когда вы добавляете элемент в List<T>
, он сохраняется в массиве: первый элемент в array[0]
, второй в array[1]
и т. Д. Однако пятый элемент не может вписаться в этот массив, так как это всего четыре элемента длиной. И поскольку длина массива не может быть изменена после того, как он был создан, единственная возможность - взять содержимое массива и переместить его в массив new , который достаточно большой, чтобы вместить эту пятую пункт также. Реализация List<T>
выбирает удвоение размера буфера массива каждый раз, когда ему не хватает места, поэтому, чтобы соответствовать пятому элементу, он удваивает емкость массива до 8. Затем 16 и так далее.
Вероятно, есть хорошая математическая поддержка, почему он выбирает удвоение, это, вероятно, хороший компромисс между дорогостоящими операциями копирования (не хочу выделять новый буфер слишком часто) и потраченным впустую пространством. Удвоение приводит к тому, что потери памяти никогда не превышают 50%, и количество раз, когда нужно выделять новый массив, уменьшается, как мне кажется, логарифмически.