The MSDN http://msdn.microsoft.com/en-us/library/eahchzkf%28v=vs.80%29.aspx明确指出
对于所有其他类型,包括结构体,sizeof 运算符只能
在不安全的代码块中使用。
The C# 语言规范 http://www.microsoft.com/en-us/download/confirmation.aspx?id=7029更精确的是:
- 成员打包到结构中的顺序未指定。
- 出于对齐目的,开头可能有未命名的填充
结构体的、结构体内部和结构体的末尾。
- 用作填充的位的内容是不确定的。
- 当应用于具有结构类型的操作数时,结果是该类型变量中的字节总数,包括任何填充。
但是 CLR 如何处理以下结构:
[StructLayout(LayoutKind.Explicit, Size = 1, Pack = 1)]
public struct MyStruct
{
[FieldOffset(0)] public byte aByte;
}
public struct MyEmptyStruct { }
In MyStruct
我们明确地强制布局、大小以及如何通过StructLayout
属性。这个结构是supposed内存中的大小为 1 字节。
另一方面MyEmptyStruct
为空,我们可以假设内存中的大小将为 0 字节 - 即使这样的结构很可能不会被使用,它仍然是一个有趣的情况。
当尝试使用以下方法计算这些结构的大小时sizeof(MyStruct)
and sizeof(MyEmptyStruct)
编译器抛出以下错误:
'*' 没有预定义的大小,因此 sizeof 只能
在不安全的环境中使用
我想知道why using sizeof
在此背景下被认为unsafe
。这个问题并不是要寻求解决方法,也不是要寻求解决方法correct计算结构体大小的方法,而是关注原因。
我想知道为什么在这种情况下使用 sizeof 被认为是不安全的。
马修·沃森的评论一针见血。您打算如何处理安全代码中的这些信息?它对任何事情都没有用(*)。它不会告诉您需要分配给 marshal 多少非托管字节;那是Marshal.SizeOf
。它只对指针算术有用,那么为什么它应该在安全子集中呢?
(*) 公平地说,有一些奇怪的极端情况用于安全sizeof
可以采用包含托管类型的结构。例如,假设您有一个通用集合类,它将分配一堆数组,并希望确保这些数组不会移动到大对象堆中;如果您可以获取包含托管对象的结构的大小,那么您可以非常轻松地编写此代码,并且不需要任何指针算术。但事实仍然是sizeof
是专门为指针算术而设计的,而不是为了让您可以围绕数组的垃圾收集启发式进行最终运行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)