구조체의 기억공간
구조체의 정렬
- 구조체 각 멤버가 자신의 자료형이 요구하는 바이트 경계(alignment)에서 시작되도록 배치되는 규칙
- CPU는 데이터가 정렬된 상태일 때 메모리 접근 횟수가 줄어들어 가장 빠르게 동작할 수 있다.
- 정렬 단위란, 해당 자료형이 메모리에서 시작될 수 있는 최소 주소 간격을 의미한다.
- 따라서 컴파일러는 구조체를 메모리에 배치할 때, 각 멤버가 자신의 정렬 단위를 만족하도록 중간에 패딩(padding)을 삽입한다.
| 자료형 |
크기 |
정렬 기준(시작 주소) |
예시 |
| char |
1byte |
아무 주소나 상관 없음 |
0x1001, 0x1002 |
| short |
2byte |
2의 배수로 시작하는 주소 |
0x1002, 0x1004 |
| int |
4byte |
(일반적으로)4의 배수로 시작하는 주소 |
0x1004, 0x1008 |
| double |
8byte |
8의 배수로 시작하는 주소 |
0x1008, 0x1010 |
패딩
- 정렬 규칙을 맞추기 위해 멤버와 멤버 사이에 자동으로 삽입되는 빈 공간
- 컴파일러가 효율적인 동작을 위해 자동으로 삽입한다. (프로그래머가 선언하지 않아도)
- 패딩이 삽입되므로 구조체 전체 크기(sizeof)는 모든 멤버 자료형의 크기 합보다 더 클 수 있다.
1
2
3
4
5
| struct SomeStruct {
int a; // -- 4byte
char b; // -- 1byte
int c; // -- 4byte
} abc;
|
실제 메모리상 배치 도식화
1
2
3
4
5
6
7
8
9
10
11
|
바이트 주소 →
0 1 2 3 4 5 6 7 8 9 10 11
+---+---+---+---+---+---+---+---+---+---+---+---+
| a0| a1| a2| a3| b |pad|pad|pad| c0| c1| c2| c3|
+---+---+---+---+---+---+---+---+---+---+---+---+
|------ a ------|
| b |
|- padding -|
|------ c ------|
|
1
2
3
4
5
| // 구조체 크기
printf("%s", "구조체의 크기 : ");
printf("%d\n", sizeof(abc));
printf("%s", "각 멤버 크기 합산 : ");
printf("%d\n", sizeof(abc.a) + sizeof(abc.b) + sizeof(abc.c));
|
1
2
| 구조체의 크기 : 12
각 멤버 크기 합산 : 9
|
Reference
C 프로그래밍 (김형근, 곽덕훈, 정재화 공저)
C 프로그래밍 강의 (방송통신대 - 이병래)
Comments