Какого размера на элемент списка List <uint>попадает в .NET 4.0? - PullRequest
4 голосов
/ 09 сентября 2011

Я знаю, что для хранения uint в памяти требуется 4 байта, но сколько места в памяти требуется для хранения List<uint>, скажем, для x числа uint с?

Как это соотносится с пространством, необходимым для uint[]?

Ответы [ 3 ]

3 голосов
/ 09 сентября 2011

Нет на элемент накладных расходов на List<T>, потому что он использует T[] для хранения своих данных. Однако List<T>, содержащий N элементов, может содержать 2N элементов в T[]. Кроме того, сама структура данных List имеет, вероятно, 32 или более байтов служебных данных.

1 голос
/ 09 сентября 2011

Вы, вероятно, заметите небольшую разницу между T[] и list<T>, но вы можете использовать

System.GC.GetTotalMemory(true);

до и после выделения объекта для получения приблизительного использования памяти.

0 голосов
/ 09 сентября 2011

List<> использует массив для внутреннего использования, поэтому List<uint> должен занимать пространство O (4 байта * n), как и uint[]. По сравнению с массивом могут быть некоторые более постоянные издержки, но обычно вам это не нужно.

В зависимости от конкретной реализации (эта может отличаться при использовании Mono в качестве среды выполнения вместо среды выполнения MS .NET), внутренний массив будет больше, чем количество фактических элементов в списке. Например, список из 5 элементов имеет внутренний массив, который может хранить 10, список из 10000 элементов может иметь внутренний массив размером 11000. Таким образом, вы не можете сказать, что внутренний массив всегда будет в два раза больше или на 5% больше. чем номер элемента списка, это также может зависеть от размера.

Редактировать: Я только что видел, Ганс Пассант описал растущее поведение List<T> здесь .

Итак, если у вас есть коллекция элементов, к которой вы хотите добавить данные, и вы не можете знать размер этой коллекции на момент создания списка, используйте List<T>. Он специально разработан для этого случая. Он обеспечивает быстрый произвольный доступ O (1) к элементам и имеет очень небольшие накладные расходы памяти (внутренний массив). С другой стороны, он очень медленно удаляется или вставляется в середину списка. Если вам часто нужны эти операции, используйте LinkedList<T>, который, однако, потребляет больше памяти (на элемент!). Если вы знаете размер своей коллекции с самого начала и знаете, что она не изменится (или просто очень мало раз), используйте массивы.

...