C/C++에서 구조체(struct)의 sizeof 값이 각 멤버의 sizeof 합계와 일치하지 않는 이유는 바이트 패딩(byte padding)과 정렬(alignment) 때문입니다.
패딩과 정렬이란 무엇인가?
C/C++의 모든 데이터 타입에는 고유한 정렬(alignment) 요구 사항이 존재합니다. 프로세서는 자신의 아키텍처에 맞는 워드(word) 길이 단위로 데이터를 처리하는데, 32비트 머신에서는 처리 단위가 4바이트(32비트)입니다. 예를 들어 다음과 같은 구조체가 있다고 가정해 보겠습니다.
예제 코드
#include <iostream>
using namespace std;
struct X
{
char b[3];
int c;
};
int main()
{
char b[3];
int c;
int total = sizeof(b) + sizeof(c);
cout << sizeof(X) << endl;
cout << total;
}실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
8 7
왜 크기가 달라질까?
구조체 내부에서는 먼저 char 배열 b(3바이트)가 메모리에 배치됩니다. 그런데 그 바로 뒤에 4바이트 크기의 int c를 이어서 배치하면 정렬 규칙을 위반하게 됩니다. 따라서 컴파일러는 b 뒤에 1바이트의 패딩을 삽입하고, c는 4바이트 경계에서 시작하도록 배치합니다. 이처럼 삽입된 패딩 바이트 때문에 구조체 전체 크기가 개별 멤버 크기의 합보다 커지게 되는 것입니다.
정렬 규칙에 대해 더 자세히 알고 싶다면 위키백과의 Data structure alignment 문서를 참고하시기 바랍니다.