-
[C++] 공용체 UnionProgramming/c++ 2023. 9. 13. 21:55728x90
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'Programming > c++' 카테고리의 다른 글
[c++] Value Category ( lvalue, prvalue, xvalue ) , decltype함수 (1) 2023.10.20 [c++] std::move (1) 2023.10.20 [c++] trim( ), 공백, 개행, 탭 제거 (whitespace 제거) (0) 2023.06.15 [c++] multiset (0) 2023.02.12 [c++] priority_queue (0) 2023.02.12