Каков размер Nullable ?

Итак, пара вопросов, на самом деле:

  1. An int ( Int32 ) указано (очевидно) 32 бита. А как насчет int? ( Nullable )? Моя интуиция говорит мне, что это будет 32 бита для целого числа плюс 8 бита для логического значения, но, возможно, реализация будет более сложной, чем эта.
  2. Я бы ответил на свой вопрос, используя sizeof (int?) ; но поскольку int? является управляемым типом, это недопустимо. Я понимаю, что размер типа может зависеть от платформы, и что в случае объектов, которые содержат ссылки на другие объекты, операция, подобная sizeof , будет вводить в заблуждение. Однако есть ли способ получить «базовый» размер (т. Е. Какой будет размер нового экземпляра) для управляемого типа с учетом текущей среды?
11
задан Dan Tao 24 August 2010 в 18:40
поделиться

4 ответа

Вы можете посмотреть в ildasm или Reflector.

If имеет два поля: a bool и T , поэтому, вероятно, 8 байтов (при условии 4-байтового выравнивания).

6
ответ дан 3 December 2019 в 08:28
поделиться

Рассмотрим метод Marshal.SizeOf . Это позволяет получить размер управляемых типов значений. Это странно, но похоже, что размер обнуляемого типа равен размеру их параметра типа (размер int? Равен размеру int и т. Д.)

0
ответ дан 3 December 2019 в 08:28
поделиться

Очень важно никогда не задавать такой вопрос, потому что вы не получите прямого ответа.

Но поскольку вы все равно это сделали: минимальный размер - 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. И помните, что стек растет вниз.

6
ответ дан 3 December 2019 в 08:28
поделиться

Я нашел описание именно этого вопроса здесь , которое включает код простого консольного приложения для проверки использования памяти.

По сути,

… Это означает, что тип, допускающий значение NULL оболочке требуется 4 байта памяти…

2
ответ дан 3 December 2019 в 08:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: