Каков размер Nullable?? - PullRequest
       43

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

11 голосов
/ 24 августа 2010

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

  1. Значение int (Int32) определено равным (очевидно) 32 битам.А как насчет int? (Nullable<int>)?Моя интуиция говорит мне, что это будет 32 бита для целого числа плюс 8 бита для логического значения, но, возможно, реализация будет более сложной, чем это.но поскольку int? является управляемым типом, это недопустимо.Я понимаю, что размер типа может зависеть от платформы, и что в случае объектов, которые содержат ссылки на другие объекты, операция, подобная sizeof, будет вводить в заблуждение.Однако есть ли способ получить «базовый» размер (т. Е. Какой будет размер нового экземпляра) для управляемого типа с учетом текущей среды?

Ответы [ 4 ]

6 голосов
/ 24 августа 2010

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

Но так как вы все равно сделали: минимальный размер составляет 0 байт. Что вы получите, когда оптимизатору JIT удастся сохранить значение в регистре процессора. Следующий размер - 2 байта, для bool? и byte ?, 1 байт для HasValue, другой байт для значения. Что вы получите редко, потому что локальные переменные должны быть выровнены по адресу, кратному 4. Дополнительные 2 байта заполнения никогда не будут использоваться.

Следующий размер 3 для краткости? и char ?, теперь вы получите 1 байт заполнения.

Большой прыжок к следующему, инт? требуется 5 байтов, но заполнение увеличивает это до 8.

Etcetera. Вы узнаете об этом, написав немного такого кода:

        int front = 42;
        bool? center = null;
        int back = 43;
        Console.WriteLine("", front, center, back);

И просмотр инструкций машинного кода с помощью отладчика. Обратите внимание на смещения регистра ebp. И будьте осторожны, что стек растет.

6 голосов
/ 24 августа 2010

Вы можете взглянуть на ildasm или Отражатель.

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

2 голосов
/ 24 августа 2010

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

В основном,

... Это указывает на то, что оболочке типа Nullable требуется 4 байта памяти ...

0 голосов
/ 24 августа 2010

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

...