Data alignment ( #pragma pack )
Data Alignment 는 32bit 환경에서는 4byte 가 빨라서 기본 4byte 정렬을 한다고 알고 잇었다.
하지만 진실은 달랐다.
보통의 경우
struct _data {
int a; short b; int c ;
}
sizeof( _data ) 를 하면 12 가 나온다.
4+2+4 = 10 이지만 4byte 정렬이 적용되어 4+2+2(empty)+4 = 12 이다.
좀 다른 경우로
struct _data {
char a; char b; char c;
}
sizeof( _data ) 를 하면 3 이 나온다.
4byte 데이터 정렬을 하면 1+1+1+1(empty) 가 되어 4가 나올거 같았지만 그렇지 않았다.
char 는 1byte 이기 때문에 구조체 정렬이 필요없기 때문이라고 알고 있었지만 조금 달랐다.
그래서 조금 다른 경우를 테스트 해봤다.
struct _data {
short a; short b; short c;
}
sizeof( _data ) = 6 이 나온다?
이거야 말로 2+2+2+2(empty) = 8 이 아닌가? 구조체 정렬은 거짓부렁이란 말인가?
struct _data {
short a; double b;
}
sizeof( _data ) = 12 이다. 2+2(empty)+8 = 12 로 구조체 정렬이 4byte 로 먹힌다.
#pragma pack(8) 을 사용하여 8byte 로 정렬을 바꾸면 2 + 6(empty) + 8 = 16 이 된다.
구조체 정렬은 잘 되고 있다. 왜 이런일이 발생하는가 실험결과
내가 또는 기본으로 설정되어있는 Data Alignment 값과 구조체의 속성중 최대 사이즈와 비교하여 둘중 작은값으로 정렬해 버린다.
Default 4byte 에서 구조체 최대 수치가 char 면 1로 , short 면 2, double 이면 default 4로 정렬하는것 이다.
결론 : 구조체 정렬값은 기본값과 구조체 속성의 최대 수치 값과 비교하여 작은쪽으로 정렬된다.











