2012-10-22 1 views
0

포인터를 사용하는 동일한 유형의 멤버 변수를 반복하는 구체적인 경우가 발생하는지 궁금합니다. 멤버 패킹/패딩은 구현 정의이지만, (gcc, clang, Visual Studio) 구현을 시도해 볼 때 실패 할 수는 없습니다. 예를 들면 다음과 같은 실패 할 수 있습니다배열로서의 C++ 클래스 멤버 패킹 실패 사례

경우라도, 모든 성공 :

#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'는 동일한 접근 제어 (private)를 가지므로'herp'는 더 높은 주소에 있어야합니다. – bames53