과거에는 컴퓨터 시스템의 메모리 용량이 적어 메모리를 최대한 적게 사용하였다.
하지만 최근에는 메모리 용량이 늘어나면서 메모리를 조금 더 사용하더라도 프로그램의 실행 속도가 향상되도록 프로그램을 개발하고 있다.
구조체의 경우에도 다양한 크기의 메모리를 하나로 묶다보니 실행 속도가 떨어지는 문제가 있어
C 컴파일러에는 구조체의 요소를 일정한 크기로 정렬하여 실행 속도를 더 빠르게 하는 개념이 추가되었다.
이 개념으로 인해 단순히 구조체의 요소들을 합산하여 구조체의 크기로 사용하다가는 버그가 발생할 수 있다.
struct Test{
char a; /*1byte*/
int b; /*4byte*/
short c; /*2byte*/
char d; /*1byte*/
}
"bbbb" == b가 4바이트를 차지
"-" == 버려지는 공간
1byte 정렬
본래의 의미대로 메모리가 구성
메모리 구성
a/b/b/b/b/c/c/d
Test 자료형의 크기는 8byte
2byte 정렬
전체 크기가 2의 배수가 되어야하고 2의 배수에 해당하는 주소에서만 요소가 시작될 수 있음
메모리 구성
a-/bb/bb/cc/d-
Test 자료형의 크기는 10byte
4byte 정렬
전체 크기가 4의 배수가 되어야하고 4의 배수에 해당하는 주소에서만 요소가 시작될 수 있음
메모리 구성
a----/bbbb/ccd-
Test 자료형의 크기는 12byte
8byte 정렬
전체 크기가 8의 배수가 되어야하고 8의 배수에 해당하는 주소에서만 요소가 시작될 수 있음
메모리 구성
a-------/bbbbccd-
Test 자료형의 크기는 16byte
버려지는 공간이 많음에도 요즘 컴파일러들은 8byte 정렬을 기본 값으로 한다.
이러한 사실을 알고, 구조체의 요소를 같은 크기끼리 모아준다면 버려지는 공간을 줄일 수 있다 !
구조체를 아래 형태로 수정한다면
struct Test{
char a; /*1byte*/
char d; /*1byte*/
short c; /*2byte*/
int b; /*4byte*/
}
8byte 정렬에서 메모리 구조가
adccbbbb/ 와 같이 되기 때문에
낭비되던 공간을 줄여 기존의
a-------/bbbbccd- 에 비해
8byte나 아낄 수 있게 된다
또한 이러한 오류를 방지하고자 직접 구조체의 크기를 계산하기 보단
sizeof(struct Test) 와 같이 sizeof 연산자를 사용하는 것이 안전하다