#pragma pack() / __packed 에 대한 설명

-- VC++ 2008. 3. 5. 13:42
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

[ 설명 ]

구조체및 공용체의 바이트 정렬을 조정한다.
디폴트로 컴파일러는 4 바이트 혹은 8바이트로 구조체 크기를 정렬한다. VC++는 디폴트가 8바이트로, 즉 이 것으로 정의 하지 않으면 지정된 구조체가 5바이트라면 실제 메모리
상에서는 8바이트의 공간을 잡는다는 말이다.

가장 문제가 되는 것은 데이터 이동의 기본단위가 1바이트이기 때문에 프로그램 내부적으로 데이터를 이동하기 위해 항상 4번의 코드 실행이 이루어 지는 것과 같습니다. 즉, 비 효율적이라는 얘기입니다.
 

[ 예제 ]

#pragma pack(push,1) // 패킷 정의
typedef struct
{
DWORD dwRiff;
DWORD dwSize;
DWORD dwWave;
}FILEHEADER;


typedef struct
{
DWORD dwCKID;
DWORD dwSize;
} CHUNKHEADER;
#pragma pack(pop) // 패킷 원상태로 변경

 

[ 형태 ]

#pragma pack(push, 정렬바이트수(ex.1,2,4,8,16))
#pragma pack(pop)

 

정렬바이트수(ex.1,2,4,8,16)는 2의 배수 격으로 들어 간다.
기본적으로 4인가로 설정이 되여 메모리로 전송할때.. 4바이트 단위로 전송을 하는데 14나 15로 전송이 될때 쓰레기 값으로... 2나 1바이트를 추가 시켜서 16을 강제로 만들어서 전송합니다 (32bit Machine에선 4바이트이상 정렬일때 빠릅니다)
헌데 이것이.. 메모리 전송일때는 별 문제가 발생하지 않지만. 소캣을 사용하는 통신 관련일때는 문제가 되어서 그런 단위를 조정해 준다. 
 
바이트정렬 방법은 2가지
 
[ 방법1 ] #pragma pack(1)

#pragma pack(1)
typedef struct _SendObject
{
byte gameType;
uint32 score;

} SendObject;
#pragma pack()
 
[ 방법2 ] __packed 키워드
 
__packed 키워드는 비주얼 스튜디오 뿐만 아니라 많은 컴파일러에서 지원.
이기종 이식을 고려하면 이게 더 편할 수도있다.
__packed 키워드는 구조체에도, 아래 예제 처럼 특정 변수에도 사용.

typedef struct _SendObject
{
byte gameType;
__packed uint32 score;

} SendObject;

'-- VC++' 카테고리의 다른 글

VC 6.0을 쓰지 말아야하는 이유?  (0) 2008.03.17
좋은 UI 라이브러리  (0) 2008.03.06
do{}while(0)를 하는 이유  (0) 2008.02.28
BHO (Browser Helper Object) 관련  (0) 2008.02.19
IOCP동작원리와 예제  (0) 2008.02.15
posted by 어린왕자악꿍