C 类成员作为数组,包装失败情况



我想知道是否有一种具体的情况,即使用指针对同一类型的成员变量进行迭代会失败?我知道会员包装/填充是实现定义的,但是在我尝试过的实现(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;
}

任何人都可以找到一种在同一类型的类成员上迭代的情况吗?

编译器如果可见性不同,则可以重新排序字段。它也可能出于任何任意原因所需的任何空间填充字段(许多编译器都具有可用于控制此行为的扩展程序)。

一个可见性指示符中的字段保证按定义中显示的顺序。即使可见性部分与其他部分相同。

也不是任何顺序。
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;
};

最新更新