【发布时间】:2021-11-22 23:50:02
【问题描述】:
当 .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
这段代码似乎暗示带有填充的结构不适合按位比较。这是什么时候,为什么?
我的假设是这与填充初始化有关,但也许还有更多事情要做。
【问题讨论】:
-
很可能是它根本没有定义所有场景中的填充区域应该发生什么
标签: c# c++ padding unmanaged pack