union

Jaemyeong Lee·2024년 8월 4일
0

FastCampusC++

목록 보기
26/78

첫 번째 블록 (공용체를 사용하지 않는 경우)

{
    // 공용체를 사용하지 않는 경우.
    // 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;
}
  1. struct Product를 선언합니다. 이 구조체는 idType, idInteger, idChars 세 개의 멤버를 가집니다.
  2. Product product = { 0, 12 };product를 초기화합니다.
    • idType은 0, idInteger는 12로 초기화됩니다.
  3. idType이 0이면 idInteger를 출력하고, 그렇지 않으면 idChars를 출력합니다.
  4. sizeof(Product)를 출력하여 구조체의 크기를 확인합니다.
    • 이 구조체는 int 두 개와 char[10]을 포함하므로 총 크기는 20 바이트입니다. 여기서 idIntegeridChars를 동시에 사용하지 않더라도 메모리를 낭비하게 됩니다.

두 번째 블록 (공용체를 사용하는 경우)

{
    // 공용체를 사용하는 경우
    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;
}
  1. union ID를 선언합니다. 이 공용체는 integerchars 두 개의 멤버를 가지며, 이들은 동일한 메모리 공간을 공유합니다.
    • integerchars는 같은 메모리 공간을 차지하므로, 메모리 사용을 최적화할 수 있습니다.
  2. struct Product를 선언합니다. 이 구조체는 idType과 공용체 ID를 멤버로 가집니다.
  3. Product product0 = { 0, {12} };Product product1 = { 1, {.chars = "abc"} };로 두 개의 Product를 초기화합니다.
    • product0idType은 0이고 id.integer는 12로 초기화됩니다.
    • product1idType은 1이고 id.chars는 "abc"로 초기화됩니다.
  4. idType에 따라 integer 또는 chars를 출력합니다.
  5. sizeof(Product)를 출력하여 구조체의 크기를 확인합니다.
    • sizeof(ID)도 출력하여 공용체의 크기를 확인합니다.
    • ID의 크기는 intchar[10] 중 더 큰 쪽인 char[10]의 크기인 10 바이트입니다.
    • Product의 크기는 int와 공용체 ID의 크기를 합한 값으로, 14 바이트입니다. 여기서 패딩이 추가될 수 있어 실제 크기는 16 바이트가 될 수 있습니다.

정리

공용체(union)를 사용하면 여러 멤버가 동일한 메모리 공간을 공유할 수 있어 메모리 사용을 최적화할 수 있습니다. 공용체의 크기는 멤버 중 가장 큰 타입의 크기로 결정됩니다. 공용체를 사용하지 않는 경우, 구조체의 모든 멤버가 각각의 메모리 공간을 차지하므로 메모리 낭비가 발생할 수 있습니다. 공용체를 사용하여 메모리를 절약하면서 필요한 데이터만 저장하고 접근할 수 있습니다. C++20에서는 구조체의 멤버를 이름으로 초기화할 수 있는 기능을 제공합니다.

profile
李家네_공부방

0개의 댓글