Сколько памяти ничего не берет?

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

Например

Dim i as Integer = Nothing

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

2 ответа

Решение

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

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

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

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

Object o = new Object()

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

Как говорит 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 к этому.

Другие вопросы по тегам