pragma pack(3)이라 언급하면, 3바이트 단위로 레지스터를 정렬하지 않나요?

mydream의 이미지

pragma pack( n) 이라는 전처리기 명령어가 실행되면 레지스터 정렬이 n바이트 단위로 이루어지는 것으로 압니다. 그렇다면 다음의 Something이라는 구조체를 3바이트 단위로 정렬하면, 그 데이터의 크기는 얼마가 될까요?

#include <iostream>
using namespace std;
#pragma pack(3)
struct Something {
	int num;
	char ch1;
};
int main() {
	cout<<sizeof(Something)<<endl;
	return 0;
}

결과는 8바이트가 나옵니다. 그런데 3바이트 단위로 레지스터를 정렬하기 때문에 6이 출력되어야 하는 것 아닌가요? 그러니까

| 1 | 2 | 3 | 4 | 5 | 6 |
1~4까지는 num, 5는 ch1이 차지하면 마지막의 6이 남는 것으로 저는 이해를 했는데요. 왜냐하면 3바이트 단위로 데이터가 잘릴 것이라 기대했기 때문입니다. 저 전처리에 입력한 숫자가 3이기 때문에요. 왜 8이 출력되는 것인가요?

익명 사용자의 이미지

이럴 때는 가지고 계신 컴파일러의 메뉴얼을 찾아보시는 것이 가장 바람직합니다.

https://msdn.microsoft.com/ko-kr/library/2e70t5y1%28v=vs.120%29.aspx
http://gcc.gnu.org/onlinedocs/gcc-4.7.0/gcc/Structure_002dPacking-Pragmas.html

대체로 1 2 4 8 등의 2의 거듭제곱인 수만 사용 가능합니다만, 그렇지 않은 컴파일러가 있을 가능성도 있습니다.

twinwings의 이미지

혹시 컴파일 경고 옵션 모두 키셨나요?

제 g++로 컴파일한 결과입니다.(-Wall)

@:~/Desktop$ g++ test.cpp -Wall
test.cpp:3:15: warning: alignment must be a small power of two, not 3 [-Wpragmas]
 #pragma pack(3)
               ^