반응형

구조체를 선언할때 보통 아래와 같은식으로 한다.


#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;

 

참조

http://www.delphibasics.co.uk/RTL.asp?Name=Packed

+ Recent posts