.NET 是否将结构填充初始化为零?
Does .NET initialize struct padding to zero?
当 .NET 将结构初始化为零时,它是否也将填充置零?
我问是因为我想知道对非托管结构进行按位比较的局限性。
请注意 CanCompareBits
如何不仅检查类型是非托管的 (!mt->ContainsPointers()
),而且检查它是紧密打包的 (!mt=>IsNotTightlyPacked
)。注意后者的双重否定:它要求类型 是 紧密包装。
// Return true if the valuetype does not contain pointer and is tightly packed
FCIMPL1(FC_BOOL_RET, ValueTypeHelper::CanCompareBits, Object* obj)
{
WRAPPER_CONTRACT;
STATIC_CONTRACT_SO_TOLERANT;
_ASSERTE(obj != NULL);
MethodTable* mt = obj->GetMethodTable();
FC_RETURN_BOOL(!mt->ContainsPointers() && !mt->IsNotTightlyPacked());
}
FCIMPLEND
这段代码似乎暗示带填充的结构不适合按位比较。什么时候是这样,为什么?
我的假设是这与填充初始化有关,但也许还有更多的事情要做。
结构填充被明确记录为不确定的。
来自https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/unsafe-code:
For alignment purposes, there may be unnamed padding at the beginning
of a struct, within a struct, and at the end of the struct. The
contents of the bits used as padding are indeterminate.
这与 C/C++ 结构的文档相符,我认为这并非巧合。 ISO C99 标准规定:
When a value is stored in an object of structure or union type,
including in a member object, the bytes of the object representation
that correspond to any padding bytes take unspecified values."
所以回答你的问题:
“当 .NET 将结构初始化为零时,它是否也将填充置零?” - 未定义,因此您不能依赖它。
“什么时候是真的?” - 总是。
“为什么”- 如果这意味着“为什么未初始化填充”,我只能推测:可能是出于性能原因,以及为了与 C/C++ 兼容以进行互操作调用。
当 .NET 将结构初始化为零时,它是否也将填充置零?
我问是因为我想知道对非托管结构进行按位比较的局限性。
请注意 CanCompareBits
如何不仅检查类型是非托管的 (!mt->ContainsPointers()
),而且检查它是紧密打包的 (!mt=>IsNotTightlyPacked
)。注意后者的双重否定:它要求类型 是 紧密包装。
// Return true if the valuetype does not contain pointer and is tightly packed
FCIMPL1(FC_BOOL_RET, ValueTypeHelper::CanCompareBits, Object* obj)
{
WRAPPER_CONTRACT;
STATIC_CONTRACT_SO_TOLERANT;
_ASSERTE(obj != NULL);
MethodTable* mt = obj->GetMethodTable();
FC_RETURN_BOOL(!mt->ContainsPointers() && !mt->IsNotTightlyPacked());
}
FCIMPLEND
这段代码似乎暗示带填充的结构不适合按位比较。什么时候是这样,为什么?
我的假设是这与填充初始化有关,但也许还有更多的事情要做。
结构填充被明确记录为不确定的。
来自https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/unsafe-code:
For alignment purposes, there may be unnamed padding at the beginning of a struct, within a struct, and at the end of the struct. The contents of the bits used as padding are indeterminate.
这与 C/C++ 结构的文档相符,我认为这并非巧合。 ISO C99 标准规定:
When a value is stored in an object of structure or union type, including in a member object, the bytes of the object representation that correspond to any padding bytes take unspecified values."
所以回答你的问题:
“当 .NET 将结构初始化为零时,它是否也将填充置零?” - 未定义,因此您不能依赖它。
“什么时候是真的?” - 总是。
“为什么”- 如果这意味着“为什么未初始化填充”,我只能推测:可能是出于性能原因,以及为了与 C/C++ 兼容以进行互操作调用。