2012-10-22 47 views
0

我想知道是否有一個具體的情況下,使用指針迭代相同類型的成員變量會失敗?我知道成員封裝/填充是實現定義的,但在我嘗試過的實現中(gcc,clang和Visual Studio),我無法讓它失敗。C++類成員作爲數組,打包失敗case

即使情況可能是有可能失敗,如下面,所有的成功:

#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; 
} 

任何人都可以在其中找到迭代的同類型故障類成員的情況下?

回答

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; 
}; 
+0

我相信關於「herp」的評論是不正確的。 9.2/14指出具有相同訪問控制的成員按順序分配; 'herp'和'anotherField'具有相同的訪問控制(私有),所以'herp'必須位於更高的地址。 – bames53