구조체를 선언할때 보통 아래와 같은식으로 한다.
#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;
참조