컴파일러는 성능향상을 위해서 CPU가 접근하기 쉬운 위치에 필드를 배치한다. 그러다 보니 중간에 빈 공간이 들어가게 되는데 이를 바이트 패딩(Byte Padding)이라고 한다.

typedef struct st
{
	char c;
	int i;
};

위 구조체크기를 일반적으로 생각한다면 5바이트라고 생각할 수 있다 (char 1바이트 + int 4바이트)

하지만 실제로 크기를 디버깅해보면 8바이트로 나온다. 이때 추가된 3바이트가 패딩값이다.

32비트 운영체제를 사용한다고 가정했을때 CPU가 RAM에서 값을 읽어올 때 한번에 4바이트씩 읽어올수 있다. 패딩 값을 고려하지 않고 그냥 읽었을때는 첫 주소로 부터 4바이트를 읽고 1바이트만 사용하여 c를 얻어온다. 나머지 3바이트를 이용해서 i 값을 읽어려고 할텐데 i는 int형이라 모두 읽는데 1바이트가 더 필요하다. 그렇기 때문에 i 값을 읽기 위해서는 CPU가 두 번 RAM에 접근해야한다.

CPU가 메모리에 접근하는건 상대적으로 느리고 비효율적인 작업이기 때문에 컴파일러는 패딩값을 넣어서 이를 최적화 하는 것이다.

패딩값이 없을때의 과정을 그림으로 설명하자면 아래와 같다.

Untitled

Untitled

Untitled

아래는 패딩값을 넣었을때의 과정을 그림으로 표현한 것이다.

Untitled

Untitled

하지만 메모리 패딩은 무조건 좋은것만은 아니다