ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C++] 공용체 Union
    Programming/c++ 2023. 9. 13. 21:55
    728x90

    Union

    공용체는 하나의 정해진 데이터형이 아니라 int, float 같이 여러개의 데이터타입을 사용해야 할 때 유용합니다. 

    개체가 많고 메모리가 제한된 경우 메모리를 절약하는데 유용할 수 있지만, 주의해서 사용해야 합니다.

    구조체와 비슷하지만 모든 멤버 변수가 하나의 메모리 공간을 공유한다는 점에서 다릅니다.

    union은 내부에 여러개의 데이터 타입의 멤버 변수를 선언하지만 실제 사용시에는 하나의 멤버 변수만 사용할 수 있습니다.

    출처 : http://www.tcpschool.com/cpp/cpp_struct_unionEnum

    공용체는 크기가 가장 큰 멤버 변수의 크기로 메모리를 할당받습니다.

     

    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

    댓글

© 2022. code-space ALL RIGHTS RESERVED.