Колко памет отнема Нищо?

Просто се чудех, ако имам променлива и й присвоя 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
Добре, това има смисъл, но какво ще кажете за референтните типове, които са nullable?   -  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 байта. Имайте предвид, че тук няма препратка.

Би било по-лесен пример да се използва "обикновен" клас вместо специалния случай с Integer. Например, помислете

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