Итак, пара вопросов, на самом деле:
int
( Int32
) указано (очевидно) 32 бита. А как насчет int?
( Nullable
)? Моя интуиция говорит мне, что это будет 32 бита для целого числа плюс 8 бита для логического значения, но, возможно, реализация будет более сложной, чем эта. sizeof (int?)
; но поскольку int?
является управляемым типом, это недопустимо. Я понимаю, что размер типа может зависеть от платформы, и что в случае объектов, которые содержат ссылки на другие объекты, операция, подобная sizeof
, будет вводить в заблуждение. Однако есть ли способ получить «базовый» размер (т. Е. Какой будет размер нового экземпляра) для управляемого типа с учетом текущей среды? Вы можете посмотреть в ildasm
или Reflector.
If имеет два поля: a bool
и T
, поэтому, вероятно, 8 байтов (при условии 4-байтового выравнивания).
Рассмотрим метод Marshal.SizeOf . Это позволяет получить размер управляемых типов значений. Это странно, но похоже, что размер обнуляемого типа равен размеру их параметра типа (размер int? Равен размеру int и т. Д.)
Очень важно никогда не задавать такой вопрос, потому что вы не получите прямого ответа.
Но поскольку вы все равно это сделали: минимальный размер - 0 байт. Что вы получите, когда оптимизатору JIT удастся сохранить значение в регистре ЦП. Следующий размер - 2 байта, для bool? и байт?, 1 байт для HasValue, еще один байт для значения. Что вы получите редко, потому что локальные переменные должны быть выровнены по адресу, кратному 4. Дополнительные 2 байта заполнения просто никогда не будут использоваться.
Следующий размер - 3? и char ?, теперь вы получите 1 байт заполнения.
Большой прыжок к следующему, int? требуется 5 байтов, но заполнение увеличивает это значение до 8.
И так далее. Вы узнаете это, написав небольшой фрагмент кода вроде этого:
int front = 42;
bool? center = null;
int back = 43;
Console.WriteLine("", front, center, back);
И посмотрев на инструкции машинного кода с помощью отладчика. Обратите внимание на смещения регистров EBP. И помните, что стек растет вниз.
Я нашел описание именно этого вопроса здесь , которое включает код простого консольного приложения для проверки использования памяти.
По сути,
… Это означает, что тип, допускающий значение NULL оболочке требуется 4 байта памяти…