pragma pack(3)이라 언급하면, 3바이트 단위로 레지스터를 정렬하지 않나요?
글쓴이: mydream / 작성시간: 토, 2015/12/26 - 2:35오후
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이 출력되는 것인가요?
Forums:
이럴 때는 가지고 계신 컴파일러의 메뉴얼을 찾아보시는
이럴 때는 가지고 계신 컴파일러의 메뉴얼을 찾아보시는 것이 가장 바람직합니다.
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의 거듭제곱인 수만 사용 가능합니다만, 그렇지 않은 컴파일러가 있을 가능성도 있습니다.
위에 익명분 말씀대로 컴파일러가 지원하지 않는 경우 같네요.
혹시 컴파일 경고 옵션 모두 키셨나요?
제 g++로 컴파일한 결과입니다.(-Wall)
댓글 달기