반응형
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로 잡혔다.
이름 없는 형태 공용체 (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 되지 않았다.
info.f = 3(=0b'11) 에서 offset (32 + 8 + 8)을 가지는 것 확인할 수 있다.
결과) 3'0000'0000'0201
같은 공간을 가지면 값을 대입할 때 overwite 하게 되지만
그렇지 않은 경우 메모리 공간을 효율적으로 사용할 수 있다.
제한된 메모리를 가지는 임베디드에서 사용한다.
반응형
'프로그래밍 언어 > 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 |
댓글