В MSDN четко указано
Для всех других типов, включая структуры, оператор sizeof может использоваться в небезопасных кодовых блоках.
Подробнее о С# Language Specification:
- Порядок, в котором элементы упакованы в структуру, не указывается.
- В целях выравнивания в начале может быть неназванное заполнение структуры, внутри структуры и в конце структуры.
- Содержимое битов, используемых в качестве дополнения, является неопределенным.
- При применении к операнду, имеющему тип структуры, результатом является общее количество байтов в переменной этого типа, включая любое дополнение.
Однако как CLR обрабатывает следующие структуры:
[StructLayout(LayoutKind.Explicit, Size = 1, Pack = 1)]
public struct MyStruct
{
[FieldOffset(0)] public byte aByte;
}
public struct MyEmptyStruct { }
В MyStruct
мы явно применяем макет, размер и как его упаковать с помощью атрибута StructLayout
. Предполагается, что эта структура имеет размер 1 байт в памяти.
С другой стороны, MyEmptyStruct
пуст, мы можем предположить, что размер в памяти будет 0 байтов - даже если такая структура, скорее всего, не будет использоваться, все же интересна.
При попытке вычислить размер структуры тезисов с помощью sizeof(MyStruct)
и sizeof(MyEmptyStruct)
компилятор выдает следующую ошибку:
'*' не имеет предопределенного размера, поэтому sizeof может только использоваться в небезопасном контексте
Я хотел бы знать , почему, используя sizeof
в этом контексте, считается unsafe
. Вопрос не в том, чтобы запрашивать обходные пути или правильный способ вычислить размер структуры, а скорее сосредоточиться на причинах.