[C] 구조체 정렬(메모리 패딩)

개요

C언어에서 구조체가 메모리에 적재되었을때 구조체의 멤버 변수들은 선언된 순서대로 인접한 주소 번지에 위치하게 됩니다. 첫번째로 선언된 멤버가 오프셋 0으로 지정되며 그 이후에 구조체 멤버 변수의 데이터 타입에 따라 오프셋이 지정됩니다.

다음의 코드를 보고 결과를 예상해 봅시다.

선언된 구조체 s 는 멤버 변수로 1바이트 크기의 문자형 타입 c, 4바이트 크기의 정수형 i 를 갖습니다.
(C언어 변수 타입에 대한 표준 정의는 ISO/IEC 9899:TC3, Programming languages — C 문서의 p21에 기술되어 있습니다.)
이를 토대로 유추되는 sizeof(st) 의 결과 값은 5입니다. 정말 그럴까요?

프로그램을 실행해 보면 실제로 출력되는 값은 sizeof(st) 의 결과 값은 8 입니다. 왜 이런 결과값이 출력되는 걸까요?

컴퓨터는 32비트/64비트 CPU 아키텍쳐에 따라 4바이트 혹은 8바이트 단위로 메모리에 접근합니다. 만약 32비트 컴퓨터에서 1바이트 크기의 데이터에 접근하려고 하면 추가적인 시프트 연산을 해야 하기 때문에 효율이 떨어집니다. 그래서 C언어 컴파일러는 데이터 접근의 효율성을 위해서 구조체를 일정한 크기로 정렬을 하게 됩니다. 이를 구조체 정렬(Data structure alignment)이라고 하며 이를 위해 남는 공간의 메모리를 채우는 것을 메모리 패딩이라고 합니다.

 

이 글은 카테고리: C, Programming에 포함되어 있습니다. 고유주소를 북마크하세요.

댓글 남기기