Thursday, June 22, 2006

__attribute__((packed))

프로그래밍중 가끔 실수하는것이 구조체의 바이트 정렬이다.
보통 시스템이 32비트이므로 4바이트로 정렬이 된다. 같은 머신에서 돌아가는 소프트웨어일 경우는 문제가 생기지 않으나 다른 머신과 통신하는 프로그램일 경우 문제가 발생한다.

typedef struct {
struct color{
uchar blue;
uchar read;
uchar black;
}
int made_in;
} apple;


위 구조체의 경우 __attribute__((packed))을 사용하지 않았으므로 8바이트가 할당된다.
color구조체는 3바이트만 사용했지만 바이트 정렬문제로 4바이트가 되서 총 8바이트다. 이런 문제를 사전에 방지하기 위해 __attribute__((packed))를 사용해야 한다.

typedef struct {
struct color{
uchar blue;
uchar read;
uchar black;
}
int made_in;
}__attribute__((packed)) apple;


윈도우의 비주얼씨에서는 #pragma pack(1)을 선언한다.