MSDN明确指出
对于所有其他类型,包括结构,sizeof 运算符只能用于不安全的代码块。
C# 语言规范更加精确:
- 未指定成员打包到结构中的顺序。
- 出于对齐目的,在结构的开头、结构内和结构的末尾可能存在未命名的填充。
- 用作填充的位的内容是不确定的。
- 当应用于具有 struct 类型的操作数时,结果是该类型变量中的总字节数,包括任何填充。
但是 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
。该问题不是要寻求解决方法,也不是要计算结构大小的正确方法,而是要关注原因。