✅ 구조체란?
C 언어에서 구조체(struct)는 여러 자료형을 하나로 묶은 사용자 정의 자료형이다.
이는 멤버들의 자료형과 순서에 따라 구조체의 실제 메모리 크기가 달라질 수 있다.
그 이유는 정렬(Alignment)과 패딩(Padding) 때문이다.
📌 구조체의 메모리 정렬(Alignment)
CPU는 성능을 위해 메모리에 데이터를 자료형에 맞게 정렬해서 저장하길 원한다.
자료형 | 크기(byte) | 정렬 기준 |
char | 1 | 1바이트 정렬 |
short | 2 | 2바이트 정렬 |
int | 4 | 4바이트 정렬 |
double | 8 | 8바이트 정렬 |
📌 정렬 기준이란?
→ 데이터는 자신의 정렬 단위의 배수인 주소에 저장되어야 함
🧱 구조체 내부의 패딩(Padding)
서로 다른 크기의 멤버가 순서대로 배치되면,
정렬 기준을 맞추기 위해 중간에 빈 공간(Padding)이 삽입됨
📌 예시
struct point {
char x; // 1 byte
short y; // 2 bytes
int z; // 4 bytes
};
💡 메모리 배치도
멤버 | 오프셋 | 설명 |
x | 0 | 1바이트 |
padding | 1 | 1바이트 (y는 2바이트 정렬 필요) |
y | 2~3 | short (2바이트 정렬 만족) |
z | 4~7 | int (4바이트 정렬 만족) |
구조체 크기: 8바이트
printf("sizeof(struct point): %zu\n", sizeof(struct point)); // 8
📏 정렬이 없다면? (#pragma pack 사용)
#pragma pack(1)
struct point {
char x;
short y;
int z;
};
→ 패딩이 사라져 메모리는 연속적으로 채워짐
→ 구조체 크기: 1(char) + 2(short) + 4(int) = 7바이트
⚠️ 하지만 정렬을 무시하면 성능 저하나 버스 에러가 발생할 수 있으니 주의!
🔄 구조체의 크기 계산 요약
- 각 멤버는 자신의 정렬 기준에 맞는 주소에 배치됨
- 정렬 기준을 만족시키기 위해 중간에 padding이 삽입됨
- 구조체 전체의 크기는 가장 큰 멤버의 정렬 기준의 배수가 되도록 정렬됨
📌 예시 2: 멤버 순서에 따른 구조체 크기 변화
struct A {
char a;
int b;
char c;
}; // 크기: 12바이트 (패딩 포함)
struct B {
int b;
char a;
char c;
}; // 크기: 8바이트 (패딩 줄어듦)
✅ 구조체 크기 최적화 팁
- 큰 자료형 → 작은 자료형 순서로 멤버 정렬
- 꼭 필요할 때만 #pragma pack 사용
- 배열 안의 구조체가 많을 경우, 패딩 절약이 메모리 효율에 큰 영향을 줄 수 있음
✅ 마무리 요약
용어 | 의미 |
정렬 (Alignment) | 멤버가 자신의 크기에 맞는 주소 위치에 정렬되어야 함 |
패딩 (Padding) | 정렬을 만족시키기 위해 삽입되는 빈 공간 |
구조체 크기 | 멤버 + 패딩 포함, 가장 큰 멤버의 정렬 기준 배수로 맞춤 |
#pragma pack(n) | 구조체 정렬을 강제로 제한하는 컴파일러 지시문 |
'프로그래밍 언어 > C' 카테고리의 다른 글
08. switch vs if...else if...else (0) | 2025.07.02 |
---|---|
07. 공용체 (Union) (0) | 2025.07.01 |
05. 함수 포인터 (Function pointer)와 void 포인터 (0) | 2025.06.27 |
04. 포인터와 문자열 (2) | 2025.06.26 |
03. 자료형 변환 (Type casting) (0) | 2025.06.24 |