2012-05-09 3 views
3

나는 이런 식으로 뭔가에 몇 가지 코드에 노력하고 넘어 해요 :이름없는 구조체/노조가

class Foo 
{ 
private: 
    union { 
    byte bar; 
    struct { 
     byte baz1; 
     byte baz2; 
    }; 
    }; 
}; 

을 지금, 나는이 경고 수준 4 컴파일하고있어 VS 2010에서 (관리되지 않는 순수) 및 물론 VS는 이름이없는 struct/union이 비표준 확장 (C4201 경고)이며이 경고를 수정하고자한다고 불평합니다.

모든 사람이 선호하는 어떤 이유가 거기에 위 :

class Foo 
{ 
private: 
    byte bar; 
    byte baz1; 
    byte baz2; 
}; 

또는 후자에 전자를 변경하면 깰 것이라고 어떤 이유로?

+5

제안 된 수정 프로그램의 메모리 레이아웃은 완전히 다릅니다. – ildjarn

답변

1

노조가 사용 된 경우 노조의 구성원간에 메모리 저장소가 공유됩니다. 두 번째 예에서는 모든 항목에 대해 별도의 저장소를 할당하지만 첫 번째 예에서는 막대와 익명의 구조체를 공유하지 않습니다.

이름없는 구조체/노동 조합은 일반적으로 권장되지 않습니다 다음 URL을 참조하십시오

Why does C++ disallow anonymous structs and unions?

나는 1 개 파괴로 예 2를 변경 볼 수 있지만 1 을 깨는 2에 당신은에 따라하지 않는 저장소가 노조에서 공유된다는 사실 (매우 나쁜 습관입니다).

0

물론 이유가 있습니다. 당신의 솔루션은 노동 조합과 함께 50 % 더 많은 공간을 메모리에 필요로합니다. 또한 유니온에서는 Foo foo;

1

에 대해 컴파일러 경고 수준을 4로 설정하면이 경고 메시지가 표시됩니다.

예. union ~ struct을 선호하는 이유가 있습니다. 두 가지 데이터 구조는 매우 다릅니다. union 여기 또는 그 반대 이유는 여기에 없으므로 그 범위를 벗어나는 것이므로 here's 링크를 클릭하십시오. 당신이 조합을 유지하려면

, 당신은이 작업을 수행 할 수 있습니다 지금 형 unionthing_라는 이름의 멤버가

class Foo 
{ 
private: 
    union { 
    int bar; 
    struct { 
     int baz1; 
     int baz2; 
    } thing_; 
    }; 
}; 

Foo있다.

관련 문제