Структура sizeof () не известна.Зачем? - PullRequest
21 голосов
/ 08 ноября 2011

Почему я не могу использовать sizeof () на простых структурах?

Например:

private struct FloatShortPair
{
    public float myFloat;
    public short myShort;
};

int size = sizeof(FloatShortPair);  //CS0233

Ошибка CS0233: «FloatShortPair» не имеет предопределенного размера, поэтомуsizeof может использоваться только в небезопасном контексте (рассмотрите возможность использования System.Runtime.InteropServices.Marshal.SizeOf)

MSDN состояния:

Оператор sizeof может использоваться только для типов, которые являются константами времени компиляции.Если вы получаете эту ошибку, убедитесь, что размер идентификатора может быть определен во время компиляции.Если это невозможно, тогда используйте SizeOf вместо sizeof.

Каким образом константы времени с плавающей запятой и short не компилируются?8 - /

1 Ответ

23 голосов
/ 08 ноября 2011

Размеры short и float постоянны - но то, как CLR решил упаковать этот плавающий элемент в память , не обязательно обязательно постоянно.Например, на 64-битном процессоре он может решить выровнять каждое значение на 8-байтовой границе.

Из спецификации C # 4, раздел 18.5.8:

ДляВ определенных предопределенных типах оператор sizeof возвращает постоянное значение, как показано в таблице ниже.

[...]

Для всех других типов результат оператора sizeofопределяется реализацией и классифицируется как значение, а не как константа.

[...]

В целях выравнивания может быть безымянный отступ в начале структуры, внутриstruct, и в конце struct.

Обратите внимание, что может использовать sizeof в этой ситуации в контексте unsafe.Нужно ли вам это использовать или Marshal.SizeOf зависит от того, что вы пытаетесь сделать.

...