Programming/c++
[C++] 공용체 Union
owls
2023. 9. 13. 21:55
728x90
Union
공용체는 하나의 정해진 데이터형이 아니라 int, float 같이 여러개의 데이터타입을 사용해야 할 때 유용합니다.
개체가 많고 메모리가 제한된 경우 메모리를 절약하는데 유용할 수 있지만, 주의해서 사용해야 합니다.
구조체와 비슷하지만 모든 멤버 변수가 하나의 메모리 공간을 공유한다는 점에서 다릅니다.
union은 내부에 여러개의 데이터 타입의 멤버 변수를 선언하지만 실제 사용시에는 하나의 멤버 변수만 사용할 수 있습니다.
공용체는 크기가 가장 큰 멤버 변수의 크기로 메모리를 할당받습니다.
Example 1
union uData {
char c; // 1byte
int i; // 4byte
short s; // 2byte
long l; // 4byte
float f; // 4byte
double d; // 8byte
int *int_ptr;
};
int mian(){
uData t;
t.i = 10;
cout << t.c << " " << t.i << " " << t.s << " " << t.l << " " << t.f << " " << t.d << " " << t.int_ptr << "\n";
// 10 10 10 1.4013e-44 -9.25596e+61 0000000A
cout << sizeof(union uData) << "\n";
// 8
return 0;
}
uData공용체에서 멤버 변수의 크기가 가장 큰 8byte로 메모리 사이즈를 할당받습니다.
포인터 변수
C에서 포인터 변수의 크기는 컴파일러 bit에 따라 달라집니다.
32bit에서는 double*, int*, char* 와 같이 각각의 포인터 변수들의 크기는 모두 4byte입니다.
64bit에서는 포인터 변수들의 크기는 8byte입니다.
Example 2
struct test {
char a; //1byte
short b; //2byte
union {
char c; //1byte
short d; //2byte
};
};
int main() {
test st;
st.d = 0x1080;
printf("%d %d\n", sizeof(struct test), st.c);
// 6 -128
return 0;
}
char는 1byte로 범위가 -128~127 이다.
short는 2byte로 범위가 –32,768 ~ 32,767이다.
0x1080의 10진수인 4224가 st.d에 저장되어 있지만, st.c는 범위가 벗어나므로 4224가 아닌 -128이 저장되었습니다.
728x90