我想知道是否有一个具体案例,使用指针迭代相同类型的成员变量会失败?我知道成员打包/填充是实现定义的,但在我尝试过的实现中(gcc,clang和Visual Studio),我不能让它失败。
即使可能会失败的情况,例如以下情况,也都会成功:
#pragma pack(16)
struct MyStruct
{
char firstChar;
char mySecondChar;
char thirdChar;
};
class MyContainerStruct
{
public:
uint64_t big;
MyStruct z1;
MyStruct z2;
} gStruct;
main()
{
MyStruct *pStruct = &(gStruct.z1); // Start with gStruct.z1
pStruct++; // Iterate to gStruct.z2
cout << pStruct->myThirdChar;
}
任何人都可以找到一个案例,其中迭代相同类型的类成员失败了吗?
答案 0 :(得分:2)
如果字段具有不同的可见性,则编译器可能会重新排序字段。它也可以根据需要随意填充任意数量的空间(许多编译器都有可用于控制此行为的扩展)。
一个可见性说明符中的字段保证按它们在定义中出现的顺序排列。可见性部分不受任何顺序的约束,即使它们与另一部分具有相同的可见性。
class A
{
public:
int someField; // will always be in the same order WRT someOtherField
int someOtherField;
private:
int anotherField; // may be before or after someField
int moreFields;
};