Сколько памяти занимает Ничто?

Мне просто интересно, если у меня есть переменная и я присваиваю ей Nothing (или Null), сколько памяти занимает переменная?

Например

Dim i as Integer = Nothing

Переменная не использует память? Или размер целого числа 4 байта? В основном я думаю, что это означает, что значение не присвоено, и поэтому нигде в памяти нет значения, поэтому оно не должно занимать память. Однако хранится информация о том, что переменная ничего не значит, поэтому эта информация должна занимать память, верно? Есть ли разница между .NET и родными языками? Или между значениями и ссылочными типами?


person Jens    schedule 07.05.2014    source источник
comment
Можете ли вы действительно объявить значение типа Integer для хранения Nothing в vb.net?   -  person Lasse V. Karlsen    schedule 07.05.2014
comment
Тип значения всегда имеет значение. Nothing просто использует значение по умолчанию для этого типа, в данном случае 0. Dim foo As Foo = Nothing ничего не хранит. Вместо этого вы можете использовать Nullable(Of Int32).   -  person Tim Schmelter    schedule 07.05.2014
comment
Хорошо, в этом есть смысл, но как насчет ссылочных типов, допускающих значение NULL?   -  person Jens    schedule 07.05.2014
comment
@jens: как отмечалось выше, ссылочному типу null/Nothing не нужно ничего хранить в куче, поскольку хранить нечего.   -  person Tim Schmelter    schedule 07.05.2014
comment
Вы смешиваете термины, nullable используется только для типов значений, когда вы заключаете их в Nullable(Of T).   -  person Lasse V. Karlsen    schedule 07.05.2014


Ответы (2)


Вообще говоря: ссылка на Null занимает в стеке только место самой ссылки. Который должен быть 8 байт в 64-битной системе.

В вашем конкретном случае: обратите внимание на разницу между значениями в упаковке и без коробки! Целое число в штучной упаковке — это ссылка на экземпляр класса Integer. Экземпляр не был создан (Ничего), поэтому он не занимает места. Ссылка занимает 8 байт.

Если бы вы использовали неупакованное значение (int), оно заняло бы пространство int (struct), что составляет ровно 4 байта. Обратите внимание, что здесь нет ссылки.

Было бы проще использовать «обычный» класс вместо специального случая с целым числом. Например, рассмотрим

Object o = new Object()

Это занимает 8 байтов в стеке, хотя сам o пуст.

person mafu    schedule 07.05.2014
comment
int — это примитивная структура, поэтому лучше не называть ее классом. Nullable<T> также является структурой. - person Adam Houldsworth; 07.05.2014
comment
Это имеет смысл, поскольку ссылка занимает 8 байтов без каких-либо дополнительных данных для фактического объекта. Из любопытства, в случае нулевой ссылки, каково значение указателя (это указатель, верно? ;-))? - person Jens; 07.05.2014
comment
@Jens Не забывайте, что ссылка - это просто тип значения. null или Nothing в ссылочном типе по сравнению со ссылкой, которая ссылается на что-то, по-прежнему будут занимать одно и то же место. - person Adam Houldsworth; 07.05.2014
comment
@Jens Значение равно 0. Это похоже на указатель, но мы называем его ссылка. Он более ограничен, чем какой-либо указатель. - person mafu; 07.05.2014
comment
Хорошо, это подводит итог довольно хорошо и отвечает на мой вопрос. Спасибо. - person Jens; 07.05.2014

Как говорит в комментарии @Tim Schmelter, присвоение значения Nothing является эквивалентом VB.NET для default(T) в C#. .

Integer всегда будет занимать 4 байта, 32 бита. Неважно, какое значение вы вкладываете в это.

Однако, если у вас есть ссылка, она будет занимать 4 байта в 32-битном процессе и 8 в 64-битном процессе, также вне зависимости от того, какое значение вы в нее поместите. Однако Integer или System.Int32 не являются ссылочными типами.

Nothing здесь не означает «нет ссылки» (как я изначально думал), просто вы присваиваете значение по умолчанию для типа в переменной. В этом случае значение по умолчанию для Integer равно 0.

Итак, ваша переменная занимает 4 байта, потому что это System.Int32. Код, который у вас есть, просто присвоит ему значение 0.

person Lasse V. Karlsen    schedule 07.05.2014
comment
Это не автоматическое преобразование, Nothing - это просто версия VB.NET default на C#. Так что Nothing — это не только null в C#, но и default. - person Tim Schmelter; 07.05.2014
comment
Спасибо. Это многое объясняет. Поэтому, я думаю, нужно всегда быть осторожным со значениями и ссылочными типами. - person Jens; 07.05.2014
comment
@Jens: я подозреваю, что ваши приоритеты неверны. Выберите подходящий тип, а не тот, который требует 4 байта больше или меньше. c2.com/cgi/wiki?PrematureOptimization - person Tim Schmelter; 07.05.2014
comment
@TimSchmelter Это не было целью вопроса. Это был скорее вопрос любопытства в отношении того, как обрабатываются технические вещи, которых я не вижу. Мой комментарий ранее означал, что это просто еще одно из различий типа значения‹-›ссылочного типа, которые полезно знать. Я не оптимизирую код в этом отношении. - person Jens; 07.05.2014