C++ C++;类成员作为数组,打包失败案例

C++ C++;类成员作为数组,打包失败案例,c++,gcc,memory-alignment,C++,Gcc,Memory Alignment,我想知道是否有一个具体的例子,使用指针迭代相同类型的成员变量会失败?我知道成员打包/填充是实现定义的,但在我尝试过的实现(gcc、clang和visualstudio)中,我不能让它失败 即使在可能失败的情况下,如以下情况,也会成功: #pragma pack(16) struct MyStruct { char firstChar; char mySecondChar; char thirdChar; }; class MyContainerStruct { pu

我想知道是否有一个具体的例子,使用指针迭代相同类型的成员变量会失败?我知道成员打包/填充是实现定义的,但在我尝试过的实现(gcc、clang和visualstudio)中,我不能让它失败

即使在可能失败的情况下,如以下情况,也会成功:

#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;
}
#pragma包(16)
结构MyStruct
{
char firstChar;
char mySecondChar;
炭黑;
};
类MyContainerStruct
{
公众:
uint64_t大;
mystructz1;
mystructz2;
}gStruct;
main()
{
MyStruct*psstruct=&(gsstruct.z1);//从gsstruct.z1开始
pStruct++;//迭代到gsstruct.z2
cout-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;
};

我相信关于herp的评论是不正确的。9.2/14规定具有相同访问控制的成员按顺序分配
herp
另一个字段
具有相同的访问控制(专用),因此
herp
必须位于更高的地址。