An int
(Int32
) имеет размер памяти 4 байта. Но каков объем памяти:
int? i = null;
и:
int? i = 3;
Это вообще или зависит от типа?
An int
(Int32
) имеет размер памяти 4 байта. Но каков объем памяти:
int? i = null;
и:
int? i = 3;
Это вообще или зависит от типа?
Я не уверен на 100%, но я считаю, что это должно быть 8 байтов, 4 байта для int32 и (поскольку каждая вещь должна быть 4-байтовой, выровненной на 32-битной машине) 4 байта для логического указания было ли задано целочисленное значение или нет.
На 64-битной машине все равно будет 8 байтов (64 бит), поскольку это самый маленький фрагмент памяти, который можно адресовать...
Размер Nullable<T>
определенно зависит от типа. Структура состоит из двух элементов.
Размер структуры обычно будет отображаться до 4 плюс размер параметра типа T.
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 байт...
An int?
- это структура, содержащая логическое hasValue
и int. Следовательно, он имеет длину 5 байт. То же самое относится ко всем экземплярам a nullable<T>
: size = sizeof(T)+sizeof(bool)
Тип с нулевым значением - это структура, которая содержит регулярную переменную и флаг для состояния null.
Для элемента с нулевым значением int это означает, что он содержит пять байтов данных, но он, конечно, дополняется до полных слов, поэтому он использует восемь байтов.
Обычно вы можете ожидать, что любой тип с нулевым значением будет на четыре байта больше обычного типа, за исключением небольших типов, таких как byte и boolean.