본문 바로가기
프로그래밍 언어/C++

[C/C++] union 공용체

by 까망 하르방 2024. 10. 27.
반응형

union 이란

공용체란 멤버변수끼리 메모리를 공유하는 것

메모리를 아낄 수 있는 장점이 있지만

다른 멤버변수에 값을 넣으면

기존 값을 overwrite 하기 때문에 잘 관리해야 한다.

#include <stdio.h>

union data
{
    double ID;
    int age;
    int score;
    char grade;
};

void main(void)
{
    union data harbang;

    harbang.age = 70;
    printf("age : %d \n", harbang.age);
    printf("grade : %c \n", harbang.grade);

    harbang.grade = 'A';
    printf("age : %d \n", harbang.age);
    printf("grade : %c \n", harbang.grade);

    printf("union 크기 : %d \n", sizeof(harbang));
}

 

 

age = 70으로 하니까 grade에도 해당 아스키 코드값이 반영되었다.
마찬가지로 grade = 'A' 로 하니 age에 동일한 아스키 코드값이 반영되었다.
공용체 크기는 double 타입의 8 Byte로 잡혔다.

union 구조체 예시 결과


 

이름 없는 형태 공용체 (anonymous union)

이름 없이도 공용체를 정의할 수 있다.

변수 선언은 불가하지만 멤버 이름을 바로 사용할 수 있다.

변수 이름이 중복될 때, 이름 없는 공용체를 함수 내에서 정의해서 사용한다.
함수 바깥에서도 static으로 정의해서 전역변수로 사용할 수 있다.
다만 외부에서 extern할수는 없다.

#include <iostream>

using namespace std;

static union {
    long data;
    short s;
    char c;
};

int main(void)
{
    union { // 이름 없는 공용체
        long data;
        short s;
        char c;
    };
    
    // 변수 선언 없이 바로 사용
    data = 0x1234;

    // 전역 변수로 사용하고 싶을 때
    ::data = 0x5678;

    cout << hex << (int)c << endl; // 34
    cout << hex << (int)::c << endl; // 78
}

 

구조체(struct) 활용

구조체도 공용체 안에서 이름없는 형태로 활용할 수 있다

union KEY {
    short code;
    struct { // anonymous struct
        char ascii;
    };
};

KEY key;
key.code = 0x001;
if (!key.ascii) {}

 

 

메모리 절약을 위한 방법이지만

메모리 공유하는 점에서 overwrite를 주의해야 한다.

#include <iostream>

using namespace std;

class Info
{
public:
    Info() {}
    ~Info() {}

    uint32_t GetDw(void) { return dw; }
    void SetDw(uint32_t v) { dw = v; }

    union
    {
        uint64_t lw; // 8Byte
        struct
        {
            union // 4 Byte
            {
                struct
                {
                    uint32_t a;
                }pg;
                struct
                {
                    uint32_t b : 8;
                    uint32_t c : 24;
                }rd;
            };
            union // 4 Byte
            {
                uint32_t dw;
                struct // anonymous struct
                {
                    uint32_t d : 8;
                    uint32_t e : 8;
                    uint32_t f : 16;
                };
            };
        };
    };
};

int main(void)
{
    Info info;

    info.lw = 0;
    printf("info size = %d\n", sizeof(info));

    info.pg.a = 4;
    info.rd.c = 2;
    cout << hex << info.lw << endl;

    info.rd.b = 1;
    cout << hex << info.lw << endl;

    info.f = 3;
    cout << hex << info.lw  << endl;

    info.lw = 1;
    cout << hex << info.lw << endl;
}

 

info.pg.a 와 info.rd.b는 같은 공간을 차지하고 있어서
값을 적용할 때 overwirte 되는 것을 볼 수 있다.
반면 겹치지 않는 다른 영역은 overwrite 되지 않았다.

union 구조체 예시 결과



info.f = 3(=0b'11) 에서 offset (32 + 8 + 8)을 가지는 것 확인할 수 있다.
결과) 3'0000'0000'0201

union 구조체 비트필드

 

 

같은 공간을 가지면 값을 대입할 때 overwite 하게 되지만
그렇지 않은 경우 메모리 공간을 효율적으로 사용할 수 있다.
제한된 메모리를 가지는 임베디드에서 사용한다.

union 구조체 활용

 

반응형

'프로그래밍 언어 > C++' 카테고리의 다른 글

[C/C++] #define과 const 차이  (7) 2024.11.02
[C++] auto 키워드  (4) 2024.10.28
[C/C++] Header Guard 활용  (2) 2024.07.24
[C++] 생성자 함수  (2) 2024.06.03
[C++] constexpr 키워드  (2) 2024.04.01

댓글