Подтвердить что ты не робот

Каков объем памяти Nullable <T>

An int (Int32) имеет размер памяти 4 байта. Но каков объем памяти:

int? i = null;

и:

int? i = 3;

Это вообще или зависит от типа?

4b9b3361

Ответ 1

Я не уверен на 100%, но я считаю, что это должно быть 8 байтов, 4 байта для int32 и (поскольку каждая вещь должна быть 4-байтовой, выровненной на 32-битной машине) 4 байта для логического указания было ли задано целочисленное значение или нет.

На 64-битной машине все равно будет 8 байтов (64 бит), поскольку это самый маленький фрагмент памяти, который можно адресовать...

Ответ 2

Размер Nullable<T> определенно зависит от типа. Структура состоит из двух элементов.

  • boolean: для hasValue
  • значение: для базового значения

Размер структуры обычно будет отображаться до 4 плюс размер параметра типа T.

Ответ 3

            int? a = 3;
  00000038  lea         ecx,[ebp-48h] 
  0000003b  mov         edx,3 
  00000040  call        78BFD740 
  00000045  nop              
            a = null;
  00000046  lea         edi,[ebp-48h] 
  00000049  pxor        xmm0,xmm0 
  0000004d  movq        mmword ptr [edi],xmm0 

Кажется, что первое dword для значения, а второе - для нулевого флага. Итак, всего 8 байтов.

Любопытный, BinaryWritter не любит писать типы с нулевым значением. Я блуждал, если он мог упаковать его более жестко, чем 8 байт...

Ответ 4

An int? - это структура, содержащая логическое hasValue и int. Следовательно, он имеет длину 5 байт. То же самое относится ко всем экземплярам a nullable<T>: size = sizeof(T)+sizeof(bool)

Ответ 5

Тип с нулевым значением - это структура, которая содержит регулярную переменную и флаг для состояния null.

Для элемента с нулевым значением int это означает, что он содержит пять байтов данных, но он, конечно, дополняется до полных слов, поэтому он использует восемь байтов.

Обычно вы можете ожидать, что любой тип с нулевым значением будет на четыре байта больше обычного типа, за исключением небольших типов, таких как byte и boolean.