51.0 구조체 멤버 정렬 사용하기

이번에는 구조체가 메모리에 올라갔을 때 멤버를 정렬(alignment)하는 기능에 대해 알아보겠습니다.

컴퓨터에서 CPU가 메모리에 접근할 때 32비트 CPU는 4바이트 단위, 64비트 CPU는 8바이트 단위로 접근합니다. 만약 32비트 CPU에서 4바이트보다 작은 데이터에 접근할 경우 내부적으로 시프트 연산이 발생해서 효율이 떨어집니다. 그래서 C 언어 컴파일러는 CPU가 메모리의 데이터에 효율적으로 접근할 있도록 구조체를 일정한 크기로 정렬을 하게 됩니다. 예를 들어 구조체 크기가 15 나 17바이트가 되면 접근 효율이 떨어지게 되므로 2, 4, 8, 16바이트 단위로 정렬을 하는 것이죠.

하지만 구조체의 멤버를 정렬하면 안 되는 경우도 있습니다. 만약 사진 파일을 저장할 때마다 정렬이 발생한다고 상상해봅시다. 추억을 담은 사진이 저장할 때마다 조금씩 깨져버리겠죠? 다른 예로는 네트워크로 데이터를 전송할 때 몇 바이트씩 어떤 순서로 보낼지 규약을 정해놓았습니다. 이때 정렬이 발생해버리면 정해놓은 규약에서 벗어나게 되므로 받는 쪽에서는 데이터를 알아볼 수가 없게 됩니다.

이제 소스 코드를 실행해보면서 구조체 정렬을 자세히 알아보겠습니다.