0

ポインターを使用して同じ型のメンバー変数を反復処理すると失敗する具体的なケースがあるかどうか疑問に思っていますか? メンバーのパッキング/パディングが実装定義であることは知っていますが、私が試した実装 (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;
}

同じ型のクラス メンバーの反復処理が失敗するケースを見つけられる人はいますか?

4

1 に答える 1

2

可視性が異なる場合、コンパイラはフィールドを並べ替えることがあります。また、任意の理由で好きな量のスペースをフィールドに埋め込むこともできます (ただし、多くのコンパイラには、この動作を制御するために使用できる拡張機能があります)。

1 つの可視性指定子内のフィールドは、定義に現れる順序であることが保証されています。可視性セクションは、別のセクションと同じ可視性を持っていても、任意の順序である必要はありません。

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;
};
于 2012-10-22T20:00:07.380 に答える