Само по себе нулевой указатель занимает 4 или 8 байт, в зависимости от того, работает ли он как 32-разрядный или 64-разрядный, как вы предполагали.
В данной коллекции может быть больше, чем это. Реализация Dictionary<TKey, TValue>
использует как массив из Entry<TKey, TValue>
структур, который содержит два int
s, а также ключ и значение, а также массив целых чисел, используемых для индексирования в этот массив. Следовательно, даже если бы не было «растущей комнаты» (и, как правило, каждая), для каждой записи понадобилось бы 20 байт или 24 байт памяти (а не только 8 или 12 по величине ключа и значения) поверх накладных расходов для самого словаря (включая накладные расходы каждого массива).
Другие реализации и другие коллекции будут иметь другие накладные расходы. Они могут даже не хранить null
для нулевой записи. null
может быть полезным способом указания значения, которое не было записано, в этом случае специальное значение будет указывать фактическое значение null
(особенно полезно в реализациях без блокировки словаря, где может быть полезно различать не только неустановленные и установленное значение, но между установкой unset, set и частично установленным значением).
Все, что вы можете сказать, это то, что настройка добавления значения null
A) занимает некоторую память, а B) не занимает память, которая с ненулевым значением будет восприниматься самим объектом. Даже B) на самом деле не выполняется, поскольку, если этот объект также был сохранен в другом месте, тогда нет никакой дополнительной стоимости памяти при наличии другой ссылки в другом месте, помимо той, которая указана в самой ссылке, что делает реальную стоимость ее такой же, как хранение null
.
Я согласен с ответом на ур, но у меня есть вопрос об этом. указатели - это переменные int32 или int64, поэтому, даже если u задает их null, у нас нет другого объекта в памяти, но все еще есть объекты int32 в качестве переменных указателя да? –
@ Dr TJ: Указатели не являются объектами int32 или int64, но они имеют одинаковый размер. Ср Double имеет тот же размер, что и int64, но отличается от другого. Нулевой указатель представлен 32 или 64 нулевыми битами, и эти биты, очевидно, должны быть где-то сохранены. – MSalters
Хорошо, спасибо за разъяснение ... –