http://blog.naver.com/pjbmylove?Redirect=Log&logNo=110177847013
#pragma pack( push, 1 )
struct _test
{
int aaa;
char bbb;
};
#pragma pack( pop )
#pragma pack( push, 1 ) / #pragma pack( pop ) 무엇입니까?
- 데이터 정렬을 1byte로 변경하는놈입니다.
왜..필요한가?
- 일단 아래 구조체 크기를 생각해보자.
struct _test
{
int aaa;
char bbb;
};
음. int( 4byte ) + char( 1byte )면 5byte일꺼야..
하지만 sizeof 해보면 8byte가 나온다.... 일단 이문제는 여기서 접어두고.
먼저 윈도우환경에서 데이터 정렬을 몇 byte로 하는지 알 필요가 있다.
윈도우의 데이터 정렬은 4byte 기준이며, 4byte가 가장 작은 메모리 할당량이다.
자 이제 위 구조체를 다시 파악해보자.
일단 4byte가 기준이니.. int(4byte) aaa; 를 할당하기 위해 4byte를 쓰고, char(1byte) bbb;를
할당하기 위해 다시 4byte를 쓴다.. 그래서 총 사이즈는 8byte가 되는것이다.
char(1byte)를 할당하기 위해 4byte를 투자한것이다. 3byte에 낭비가 있다.
해결 방안.
- 해당 구조체를 #pragma pack( push, 1 ) struct {..} #pragma pack( pop )으로 감싼다.
위 선언을 통해 데이터 정렬을 1byte기준으로 변경하는것이다.
다시 sizeof를 해보면 5byte가 되었을 것이다.
어디서 주로 사용되는가?
- 네트워크 패킷 구조체정의에서 주로 사용된다.
3줄요약
1. 윈도우 메모리 정렬 기준 4byte.
2. #pragma pack( push, 1 ) / #pragma pack( pop ) 메모리 정렬 기준 1byte 변경 가능.
3. 네트워크 패킷 구조체에서 주로 사용.
[출처] #pragma pack( push, 1 )|작성자 박종부