sizeof()结构未知。 为什么?
为什么我不能在简单结构上使用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。
float和short如何编译时间常量? 8 /
short
和float
的大小是不变的 - 但CLR如何决定将这个float放在内存中并不一定是恒定的。 例如,在一个64位的处理器上,它可能会决定将每个值对齐到一个8字节的边界上。
从C#4规范中,第18.5.8节:
对于某些预定义的类型, sizeof
运算符产生一个常数值,如下表所示。
[...]
对于所有其他类型, sizeof
运算符的结果是实现定义的,并被分类为值,而不是常量。
[...]
出于对齐的目的,在结构的开始处,结构内以及结构的末端可能存在未命名的填充。
请注意,在这种情况下,您可以在unsafe
上下文中使用sizeof
。 无论你应该使用该还是Marshal.SizeOf
取决于你想要做什么。