728x90
union
union은 struct와 비슷한 생김새이나, 메모리를 조금 특별하게 관리하는 방법입니다.
우선 union을 사용하는 예시를 통해 사용 방법을 알아보도록 하겠습니다.
union box {
int item1;
double item2;
char item3[100];
};
strcut와 매우 비슷한 생김새입니다.
union은 자신을 구성하는 멤버들 중 가장 용량이 큰 멤버를 기준으로 용량을 확보합니다.
그렇다면 위의 예시에서는 item3이 가장 크므로 100바이트가 할당되어야 할 거 같은데,
sizeof를 해보면 104가 나옵니다.
이는 주소 조정(alignment) 때문에 발생하는 현상으로, item3[8]로 했을 가장 큰 것이 8byte이므로 그 정도를 할당하지만
item3[9]일 때는 넉넉히 16byte로 합니다.
즉 가장 큰 원소인 8byte double 타입의 두배로 생각하시면 됩니다. (8의 배수지점에 위치합니다)
struct 나 union이 위치하는 곳은 가장 큰 원소(배열제외)의 크기의 배수 지점에 위치하는 것이 일반적입니다.
위에 item1, 2가 둘다 char이면 9byte가 되고 (1의 배수 지점에 위치)
둘중 하나만이라도 int로 바꾸면 12byte가 됩니다. (4의 배수 지점에 위치)
일반 변수들도 대부분 타입에 따라 주소가 align이 됩니다.
그러나 컴파일러마다 다를 수 있으므로 유의하시기 바랍니다.
typedef와 union
strcut와 마찬가지로 union에서도 typedef가 가능합니다.
typedef union box {
int item1;
double item2;
char item3[100];
}BOX;
union 뒤 이름의 생략도 가능합니다.
typedef union {
int item1;
double item2;
char item3[9];
}Box;
728x90
'c언어' 카테고리의 다른 글
[C언어] - 함수포인터 (0) | 2022.06.15 |
---|---|
[C언어] - Enum (열거형) (0) | 2022.06.15 |
[C언어] - typedef (0) | 2022.06.12 |
[C언어] - 구조체 (Struct) (0) | 2022.06.12 |
[C언어] - 동적 메모리 할당 (malloc) (0) | 2022.06.12 |