{
// 공용체를 사용하지 않는 경우.
// idInteger, idChars 의 메모리 낭비
struct Product
{
int idType;
int idInteger;
char idChars[10];
};
Product product = { 0, 12 };
if (product.idType == 0)
cout << product.idInteger << endl;
else
cout << product.idChars << endl;
cout << "size : " << sizeof(Product) << endl;
}
struct Product
를 선언합니다. 이 구조체는 idType
, idInteger
, idChars
세 개의 멤버를 가집니다.Product product = { 0, 12 };
로 product
를 초기화합니다.idType
은 0, idInteger
는 12로 초기화됩니다.idType
이 0이면 idInteger
를 출력하고, 그렇지 않으면 idChars
를 출력합니다.sizeof(Product)
를 출력하여 구조체의 크기를 확인합니다.int
두 개와 char[10]
을 포함하므로 총 크기는 20 바이트입니다. 여기서 idInteger
와 idChars
를 동시에 사용하지 않더라도 메모리를 낭비하게 됩니다.{
// 공용체를 사용하는 경우
union ID
{
// integer와 chars가 메모리를 공유한다.
int integer;
char chars[10];
};
struct Product
{
int idType;
ID id;
};
Product product0 = { 0, {12} };
Product product1 = { 1, {.chars = "abc"} }; // C++ 2x 이상
if (product0.idType == 0)
cout << product0.id.integer << endl;
else
cout << product0.id.chars << endl;
if (product1.idType == 0)
cout << product1.id.integer << endl;
else
cout << product1.id.chars << endl;
cout << "size : " << sizeof(Product) << endl;
cout << "size : " << sizeof(ID) << endl;
}
union ID
를 선언합니다. 이 공용체는 integer
와 chars
두 개의 멤버를 가지며, 이들은 동일한 메모리 공간을 공유합니다.integer
와 chars
는 같은 메모리 공간을 차지하므로, 메모리 사용을 최적화할 수 있습니다.struct Product
를 선언합니다. 이 구조체는 idType
과 공용체 ID
를 멤버로 가집니다.Product product0 = { 0, {12} };
와 Product product1 = { 1, {.chars = "abc"} };
로 두 개의 Product
를 초기화합니다.product0
의 idType
은 0이고 id.integer
는 12로 초기화됩니다.product1
의 idType
은 1이고 id.chars
는 "abc"로 초기화됩니다.idType
에 따라 integer
또는 chars
를 출력합니다.sizeof(Product)
를 출력하여 구조체의 크기를 확인합니다.sizeof(ID)
도 출력하여 공용체의 크기를 확인합니다.ID
의 크기는 int
와 char[10]
중 더 큰 쪽인 char[10]
의 크기인 10 바이트입니다.Product
의 크기는 int
와 공용체 ID
의 크기를 합한 값으로, 14 바이트입니다. 여기서 패딩이 추가될 수 있어 실제 크기는 16 바이트가 될 수 있습니다.공용체(union
)를 사용하면 여러 멤버가 동일한 메모리 공간을 공유할 수 있어 메모리 사용을 최적화할 수 있습니다. 공용체의 크기는 멤버 중 가장 큰 타입의 크기로 결정됩니다. 공용체를 사용하지 않는 경우, 구조체의 모든 멤버가 각각의 메모리 공간을 차지하므로 메모리 낭비가 발생할 수 있습니다. 공용체를 사용하여 메모리를 절약하면서 필요한 데이터만 저장하고 접근할 수 있습니다. C++20에서는 구조체의 멤버를 이름으로 초기화할 수 있는 기능을 제공합니다.