본문 바로가기

프로그래밍/C++

#pragma pack( push, 1 )

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 )|작성자 박종부


'프로그래밍 > C++' 카테고리의 다른 글

[문자 함수(isupper, isalnum, isalpha 등)]  (0) 2014.02.14
참고사항 즐겨찾기  (0) 2011.01.17
싱글톤~ 기초  (0) 2010.06.29
C++  (0) 2010.05.20
클레스  (0) 2010.05.20