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. 핵심 포인트#

  1. 구조체는 단순히 이어붙는 것이 아니라 정렬 규칙에 따라 배치된다.
  2. 그 과정에서 패딩(padding) 이 삽입되어 실제 크기가 커질 수 있다.
  3. 멤버 순서를 조정하면 패딩 낭비를 줄일 수 있다.
  4. #pragma pack으로 패딩을 강제로 제거할 수 있지만, 성능과 이식성 문제를 고려해야 한다.