struct를 사용한 코드를 보면 __attribute__ ((packed))를 사용하는 경우가 있습니다.

그냥 사용해도 되는데 굳이 __attribute__ ((packed))를 사용할까요?

그 이유는 아래 예제를 보면 이해가 쉽습니다.

struct item_t{
    char    one_byte;
    int     four_byte;
};

int   main  ( int argc, char *argv[])
{
    struct item_t   data;

    printf( "item_t data size is=%d\n", sizeof( data));

    return 0;
}

sturct item_t data의 크기는 얼마로 나올까요? 변수 크기로만 셈한다면 5가 나와야 할 것 같은데,

실제 실행해 보면 엉뚱하게 8이 나옵니다. 이는 엉뚱한 것이 아니라 시스템에 최적화하여

컴파일 되었기 때문입니다. 주소를 지정할 때 32비트에서는 4 바이트 단위로 끊는 것이 

처리 속도가 빠르기 때문에 char one_byte 다음에 int four_byte가 연속되는 것이 아니라

3바이트를 건너 띄고 int four_byte가 배치됩니다.

문제는 통신할 때입니다. 분명 char one_byte와 int four_byte로 5바이트를 보낸다고 했는데,

상대방은 8바이트를 받으니 말이죠.

이럴 때 __attribute__ ((packed))를 사용하면 주소 지정을 위한 최적화가 취소됩니다.



struct __attribute__ ((packed)) item_t{
    char    one_byte;
    int     four_byte;
};

int   main  ( int argc, char *argv[])
{
    struct item_t   data;

    printf( "item_t data size is=%d\n", sizeof( data));

    return 0;
}

이제 실행해 보면 변수가 자리잡는 것만큼 5로 출력됩니다. 구조체 데이터를 변수가 차지하는 공간만큼 사용할 때 이용하세요.