공용체의 원리

공용체(union)은 흔히 구조체(structure)와 비교된다. 문법이 거의 비슷하기 때문.

공용체와 구조체의 차이는 뭘까? 둘다 다른 타입을 한곳에 모아놓은 것임.

구조체는 다른 타입들이 자기들 자료형에 맞게 다른 메모리공간을 차지하고 있었음. 그 결과 중간에 패딩이 생기기도 하고..

하지만 공용체는 그 다른 타입들이 같은 메모리를 사용한다. 이게 어케 가능할까?

union my_union
	{
		int i;
		double d;
		char c;
	};

	union my_union uni;

	printf("zd\\n", sizeof(union my_union));
	printf("%lld\\n", (long long)&uni);
	printf("%lld %lld %lld\\n", (long long)&uni.i, (long long)&uni.d, (long long)&uni.c);

유니온의 템플릿의 사이즈와, 유니온 변수의 주소와, 유니온 변수들의 멤버들의 주소를 찍어보자.

Untitled

템플릿 사이즈가 8바이트가 나왔다. 4+8+1이라서.. 구조체라면 16바이트가 나왔을 듯. 그런데 어떻게 8바이트만 나왔을까. 단순 합만 해도 13바이트인데

이는 세 멤버가 메모리를 공유하는데, 그 중 가장 큰 자료형을 기준으로 하기 때문임.

그다음 주소를 보자. 첫 멤버의 주소가 변수명의 주소와 같다. 이건 구조체와 같다.

그런데 두번째멤버, 세번째 멤버 모두 시작주소가 동일하다. 즉 메모리를 공유하고 있다.

같은 원리로

union my_union save[10];

printf("%zd\\n", sizeof(save));

공용체 배열의 크기는

Untitled

80이 된다.