[C언어] 13.구조체 멤버 맞춤
C언어 학습 노트 : 13. 구조체 멤버 맞춤#
1. 구조체와 메모리 배치#
- 구조체는 멤버를 단순히 이어붙이는 것이 아니라, 정렬(Alignment) 규칙에 따라 메모리에 배치된다.
- 예를 들어
int + char를 선언하면 논리적으로는 5바이트지만, 실제 구조체 크기는 8바이트가 될 수 있다. - 이유: CPU는 메모리를 1바이트 단위가 아니라 워드(word) 단위로 읽는 것이 효율적이므로, 멤버가 워드 경계에 맞춰 배치된다.
2. 패딩(Padding)과 정렬#
구조체 내부에는 CPU 접근 효율성을 위해 사용하지 않는 공간(패딩) 이 삽입된다.
구조체의 전체 크기는 가장 큰 멤버 크기의 배수로 맞춰진다.
멤버 순서를 바꿔 배치하면 불필요한 패딩을 줄일 수 있다.
예:
struct A { char c; // 1바이트 int i; // 4바이트 }; // 보통 8바이트 (패딩 3바이트 포함) struct B { int i; // 4바이트 char c; // 1바이트 }; // 보통 8바이트지만 패딩은 뒤쪽에만 생김
3. #pragma pack#
- 패딩을 없애고 싶은 경우
#pragma pack(n)을 사용하면 멤버 정렬 단위를n바이트로 지정할 수 있다. #pragma pack(push, 1)→ 1바이트 단위로 정렬하여 패딩 제거 가능.- 하지만 패딩 제거는 CPU 접근 속도를 떨어뜨릴 수 있으며, 다른 플랫폼으로의 이식성에도 문제가 생길 수 있다.
- 따라서 패딩 제거는 꼭 필요한 경우(네트워크 프로토콜, 파일 입출력) 에만 사용한다.
4. 핵심 포인트#
- 구조체는 단순히 이어붙는 것이 아니라 정렬 규칙에 따라 배치된다.
- 그 과정에서 패딩(padding) 이 삽입되어 실제 크기가 커질 수 있다.
- 멤버 순서를 조정하면 패딩 낭비를 줄일 수 있다.
#pragma pack으로 패딩을 강제로 제거할 수 있지만, 성능과 이식성 문제를 고려해야 한다.