2013-07-27 2 views
14

부스트 변형 및 C/C++에서 union 데이터 형식 간의 차이점을 궁금합니다. union 데이터 유형이 동일한 메모리 위치를 차지하고 메모리 영역의 가장 큰 데이터 유형이 사용 된 총 메모리 양을 차지한다는 것을 알고 있습니다. 부스트 변형은 본질적으로 c/C++의 연합입니까?

union space { 
    char CHAR; 
    float FLOAT; 
    int INTEGER; 
}S; 

int 때문에 메모리의 4 바이트를 차지한다 float 및 최대 크기와 동일하다. Boost Variant와 union 데이터 유형간에 유사점과 다른 점이 있습니까? Boost Variant는 모든 데이터 유형을 사용할 수 있으며 데이터 유형 "다형성"을 허용한다는 것을 알고 있습니다. (OOP 주제 단어를 잘못 사용하는 경우이를 수정하십시오.) 따라서 유니온 데이터 타입은 다형성의 한 종류입니까?

답변

11

부스트 변형은 공용체를 에뮬레이션하지만 구현시 공용체를 사용하지 않습니다. 대신 정렬 된 저장소 및 배치를 사용합니다.

방문자 개체를 변형에 적용하면 올바른 오버로드가 선택된다는 의미에서 다형성입니다. 이 선택은 런타임에 이루어져야하지만,이를위한 객체 코드는 컴파일 타임에 전개됩니다. 그래서 꽤 빠릅니다.

16

가장 큰 차이점은 부스트의 변형이 어떤 유형이 그 안에 저장되어 있는지 알 수 있기 때문에 실수를 할 수 없으며 UB가 사용자가 노동 조합과 같은 방식으로 변형을 오용하지 못하게 할 수 있습니다. 이것은 또한 Variant가 비 POD (즉, 실제로 유용한) 유형을 취하는 것을 허용합니다. 또한 Variant에는 방문자 및 재귀 변형 허용과 같은 몇 가지 추가 트릭이 있습니다.

유니온을 사용하는 가장 좋은 지침은 "UB를 호출하지 않고 잘 사용하는 것이 거의 불가능하기 때문에"하지 않는 것입니다. Variant에는 적용되지 않으므로 추천하는 것이 훨씬 안전합니다.

+3

"UB"및 "POD"란 무엇입니까? – pandoragami

+3

@ user2555139 정의되지 않은 동작 및 일반 올드 데이터 (유형) – Rapptz