공용체의 원리
공용체(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);
유니온의 템플릿의 사이즈와, 유니온 변수의 주소와, 유니온 변수들의 멤버들의 주소를 찍어보자.
템플릿 사이즈가 8바이트가 나왔다. 4+8+1이라서.. 구조체라면 16바이트가 나왔을 듯. 그런데 어떻게 8바이트만 나왔을까. 단순 합만 해도 13바이트인데
이는 세 멤버가 메모리를 공유하는데, 그 중 가장 큰 자료형을 기준으로 하기 때문임.
그다음 주소를 보자. 첫 멤버의 주소가 변수명의 주소와 같다. 이건 구조체와 같다.
그런데 두번째멤버, 세번째 멤버 모두 시작주소가 동일하다. 즉 메모리를 공유하고 있다.
같은 원리로
union my_union save[10];
printf("%zd\\n", sizeof(save));
공용체 배열의 크기는
80이 된다.