공용체라는 것은 쓸 일이 별로 없지만, 실제 업무에서 보게 되었으므로 공부해 봤다.
사실 공부라고 할 것도 없을만큼 간단한 내용이라...
우선 공용체는 구조체와 비슷하게 생겼다.
하지만 구조체는 내부에 변수나 함수(C++)가 추가됨에 따라 그만큼 메모리를 차지하기 때문에 사용하는 메모리가 증가하지만, 공용체는 가장 큰 변수의 크기만큼 메모리를 할당하고 해당 메모리를 말 그대로 '공유'하기 때문에 더 커지지 않는다.
기본적인 개념은 다른 곳에서도 쉽게 설명하고 있기 때문에 예제를 적도록 하겠다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #include <stdio.h> #include <string.h> union MyUnion { unsigned char c; unsigned short s; int i; unsigned char myCharArray[6]; }; int main() { MyUnion myUnion; memcpy(myUnion.myCharArray, "\xAA\xBB\xCC\xDD\xEE\xFF", 6); printf("char : %012X\n", myUnion.c); printf("short : %012X\n", myUnion.s); printf("int : %012X\n", myUnion.i); printf("array : %02X%02X%02X%02X%02X%02X\n", myUnion.myCharArray[0], myUnion.myCharArray[1], myUnion.myCharArray[2], myUnion.myCharArray[3], myUnion.myCharArray[4], myUnion.myCharArray[5]); return 0; } | cs |
간단한 예제로, union 내부에 char, short, int, char array의 4가지 변수가 선언되어 있다.
여기서 가장 큰 변수는 myCharArray로 총 6바이트를 차지한다.
따라서 공용체 MyUnion은 선언 시 6바이트의 메모리 공간을 차지하게 되며(패딩은 고려하지 않는다) 해당 공간을 나머지 변수들이 공유한다.
공유한다고 해서 따로 가지는 것이 아니라 변수마다 가장 앞에서부터, 즉 offset 0에서부터 변수의 크기만큼 메모리를 가진다.
그림으로 나타내면 다음과 같다.
[그림 1] MyUnion 메모리 구조도
그리고 위 프로그램을 실행시켜서 나온 output은 다음과 같다.
[그림 2] 프로그램 실행 결과
왜 short와 int의 출력 결과가 저렇게 나오는지는 바이트 오더(Byte order)에 대해서 공부하면 알 수 있을 것이다.
'Programming' 카테고리의 다른 글
[Go] Defer, Panic, Recovery (0) | 2016.10.09 |
---|---|
[DLL Injection] DLL Injector (0) | 2016.10.05 |
[Go] struct{} 와 &struct{} 선언의 차이점? (3) | 2016.07.23 |
[C++] Reference In Low-level (0) | 2016.07.02 |
[MITM] Create Repository 'WLAN-Crack' (0) | 2016.06.17 |