Каков объем памяти Nullable <T>
An int
(Int32
) имеет размер памяти 4 байта. Но каков объем памяти:
int? i = null;
и:
int? i = 3;
Это вообще или зависит от типа?
Ответы
Ответ 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.