Programming/c++

[C++] 공용체 Union

owls 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