구조체를 선언할때 보통 아래와 같은식으로 한다.
#pragma pack(push, 1)
구조체 정의
#pragma pack(pop)
왜냐하면 Win32에서는 기본형이 4Byte이므로 4Byte씩 처리하는것이 가장 빠르다.
그래서 win32에서는 데이타 정렬((Data alignment))을 기본적으로 4Byte씩 하도록 되어있다.
struct A
{
char a;
short b;
};
위와 같이 struct가 정의된경우 struct A를 sizeof(A) 하면 얼마일까?
char a = 1Byte , short b = 2Byte 이므로 sizeof(A) = 3Byte가 나올까?
그냥하면 3Byte가 아닌 8Byte가 나온다.
위 구조체의 데이타를 같은 구조체에 copy하는데는 문제없겠지만
socket이나 serial로 전송하거나 한다면 문제가 발생할 것이다.
이럴때 데이타정렬을 원하는 size로 하게 하려면
#pragma pack( 1)을 하면 된다.
#pragma pack(push, 1)
struct A
{
char a;
short b;
};
#pragma pack(pop)
#pragma pack(push) //이전 데이타 정렬 보관
#pragma pack(1) // 1Byte씩 데이타정렬 설정
...
#pragma pack(pop) //이전 데이타 정렬 복구
어쩌다 한번씩 깜빡하고 이문제로 해맬때 있다.
혹 모르는 분을 위해..
그리고 스스로 기억을위해 정리해본다.
델파이에서는 packed 키워드를 이용하여 정렬한다.
type
// Declare an unpacked record
TDefaultRecord = Record
name1 : string[4];
floater : single;
name2 : char;
int : Integer;
end;
// Declare a packed record
TPackedRecord = Packed Record
name1 : string[4];
floater : single;
name2 : char;
int : Integer;
end;
참조