구조체 메모리 크기 (Struct Memory Size)
기술노트
=== C 언어 구조체 메모리 크기 (Struct Memory Size) ===
C 언어에서 typedef struct
를 통해 정의된 구조체는 내부 멤버 변수들의 선언 순서와 자료형에 따라 메모리 공간의 크기 및 배치 방식이 달라집니다.
기업 필기 테스트에서 자주 출제되는 주제입니다.
==== 기본 타입별 크기 ====
char
: 1바이트int
: 4바이트double
: 8바이트
sizeof
연산자를 통해 구조체 전체의 크기를 확인할 수 있습니다.
==== 예제 1: 기본 구조체 메모리 크기 ====
typedef struct student {
char a;
int b;
} S;
int main() {
printf("메모리 크기 = %d\n", sizeof(S)); // 출력: 8
return 0;
}
char
는 1바이트,int
는 4바이트이므로 단순 계산으로는 5바이트가 예상됩니다.- 그러나 실제 출력값은 8바이트입니다.
'''''왜 그럴까요?'''''
==== 구조체 정렬 규칙 ====
- 각 멤버는 **자료형의 정렬 기준(alignment)**에 따라 메모리에 배치됩니다. 일반적으로 4바이트 단위로 정렬됩니다.
- 구조체 전체의 크기는 가장 큰 멤버의 크기 배수가 되도록 패딩(padding)됩니다.
예제에서 char a
뒤에는 3바이트의 패딩이 삽입되어, int b
가 4바이트 정렬 주소에 위치하게 됩니다.
[[파일:Struct-align1.png|center|600px]]
==== 예제 2: 연속된 char 변수 ====
typedef struct student {
char a;
char b;
int c;
} S;
char a
와char b
는 하나의 4바이트 블록에 함께 배치됩니다.- 이후 2바이트의 패딩이 추가되고,
int c
가 정렬된 위치에 배치됩니다.
[[파일:Struct-align2.png|center|600px]]
→ 총 8바이트
==== 예제 3: 멤버 순서 변경 ====
typedef struct student {
char a;
int c;
char b;
} S;
char a
뒤에 3바이트의 패딩이 삽입되고,int c
가 정렬된 위치에 배치됩니다.char b
는 다시 별도 4바이트 블록에 위치하며, 그 뒤에 3바이트 패딩이 붙습니다.
[[파일:Struct-align3.png|center|600px]]
→ 총 12바이트
==== 예제 4: double 포함 구조체 ====
typedef struct student {
char a;
int c;
double b;
} S;
double
의 정렬 기준은 8바이트입니다.- 전체 구조체는 8바이트 단위 정렬을 따르며, 멤버들이 이에 맞게 배치되어 총 16바이트가 됩니다.
[[파일:Struct-align4.png|center|600px]]
==== 정리 ====
- 구조체의 메모리 크기는 멤버의 자료형 크기와 정렬 기준에 따라 달라집니다.
- 멤버의 선언 순서에 따라 불필요한 패딩이 생길 수 있으며, 이를 줄이기 위해 작은 타입을 먼저 선언하는 것이 유리합니다.
==== 참고자료 ====
- 원문 블로그 보기