구조체의 기억공간

구조체의 정렬

  • 구조체 각 멤버가 자신의 자료형이 요구하는 바이트 경계(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