구조체와 공용체는 C와 C++에서 제공되는 사용자 정의 데이터 타입이다. 둘 다 여러 개의 멤버 변수를 가질 수 있지만, 메모리 할당 방식과 데이터 저장 방식에 차이가 있다.
메모리 할당 방식
구조체는 각 멤버 변수가 별도의 메모리 공간을 차지하므로 구조체의 크기는 모든 멤버 변수가 차지하는 메모리 공간의 합과 같다.
#include <stdio.h>
typedef struct student {
int age;
double weight;
char gender;
} Student;
int main() {
Student je;
printf("%p %p %p\n", &je.age, &je.weight, &je.gender); // 0x16fdb7430 0x16fdb7438 0x16fdb7440
printf("%lu\n", sizeof(Student)); // 24
return 0;
}
예상되는 student 구조체의 총 크기는 4bytes(age) + 8bytes(weight) + 1bytes(gender) = 13bytes 이다. 하지만 메모리 패딩이 발생하여 24로 설정된다. 패딩은 CPU가 메모리를 더 효율적으로 접근하고 읽는데 도움을 준다. CPU는 메모리를 특정 바이트 단위로 읽기 때문에 해당 바이트 경계에 맞춰 배치되면 접근 속도가 빨라진다.
공용체는 모든 멤버 변수가 같은 메모리 공간을 공유하기 때문에 공용체의 크기는 가장 큰 멤버 변수가 차지하는 메모리 크기와 동일하다. 동시에 하나의 멤버만 저장할 수 있고, 다른 멤버의 값을 저장하면 이전에 저장된 값은 덮어 써진다.
#include <stdio.h>
typedef union box {
int a;
double b;
char c;
} Box;
int main() {
Box box;
printf("%p %p %p\n", &box.a, &box.b, &box.c); // 0x16b9f7440 0x16b9f7440 0x16b9f7440
printf("%lu\n", sizeof(Box)); // 8
return 0;
}
이 경우 공용체의 크기는 8bytes(b)가 된다.
데이터 저장 및 접근
구조체는 여러 멤버 변수가 동시에 값을 가질 수 있어 모든 멤버를 동시에 접근하여 사용할 수 있다. 반면 공용체는 여러 멤버 변수가 같은 메모리 공간을 공유하므로 한 번에 하나의 멤버만 값을 갖는다. 새로 하나의 값을 할당하면 이전에 저장된 다른 값은 덮어써지게 된다.
따라서 구조체는 여러 종류의 데이터를 동시에 저장하고 다뤄야 할 때 사용된다. 공용체는 하나의 메모리 공간을 여러 용도로 사용해야 할 때 유용하며 메모리를 절약할 수 있다. 서로 다른 데이터 타입의 값을 동일한 메모리 공간에서 교대로 사용해야 할 때 사용된다. 이 차이를 고려해 적절한 경우에 맞게 구조체와 공용체를 선택하여 사용하도록 한다.
'C++' 카테고리의 다른 글
[C++] 나눗셈에서 소수점 포함하기 (0) | 2024.10.08 |
---|---|
[C++] N차원 배열 선언 방법 (0) | 2024.10.08 |
[C++] 시간초과 해결방법 (1) | 2024.09.20 |