하나 이상의 요소로 구성된 데이터를 송수신하기 위해서는 스트럭쳐를 구성하는 것이 좋습니다.

바이트 단위로 char, short, int, float를 잘라 내기 하는 것보다 스트럭쳐로 한 번에 보내고

받는 것이 나중에 요소별로 구분할 필요가 없어 좋기 때문이죠.


그런데 서로 다른 언어로 작성되었다면 주의할 것이 있습니다.

반드시라고 해도 좋을 정도로 __attribute__ ((packed)) 를 사용해야 안전합니다.

왜 일까요?


32비트 시스템에서 아래의 new_type_t 스트럭쳐 크기는 몇 바이트일까요?


struct {

    char a;

    char b;

    char c;

    int  ndx;

}  new_type_t;


변수 타입을 따지면 7바이트일 것 같지만, 아닙니다.

만일 크기가 7이었다면 이 글을 작성할 일이 없었을 것입니다. ^^


int main( void)

{

    printf( "size of new_type_t= %d\n", sizeof( new_type_t));


    return 0;

}


출력해 보면 8일라고 나오지요? 아래 5일 것 같은 스트럭쳐도 역시 크기가 8이라고 나옵니다.


struct {

    char a;

    int  ndx;

}  new_type_t;


이렇게 값이 차이나는 것은 32비트 시스템에 최적화하기 위해서입니다.

32비트에서는 4의 배수로 주소가 증가되어야 벼수에 빠르게 접근할 수 있습니다.

그래서 int 형인 ndx를 빠르게 접근하기 위해서 앞에 빈 공간을 두는 것이죠.


이런 최적화가 다른 모든 언어에서 처리한다고 해도 문제가 있습니다.

상대하는 시스템이 16비트 시스템이거나 64비트, 또는 128비트 시스템이라면

역시 문제가 발생하지요.


그래서 송수신할 때에는 최적화 때문에 생성되는 빈 바이트가 없도록

처리해 주어야 합니다. 그것이 __attribute__ ((packed)) 입니다.

아래와 같이 __attribute__ ((packed))를 넣어 주고 크기를 확인해 보세요.


struct {

    char a;

    char b;

    char c;

    int  ndx;

} __attribute__ ((packed)) new_type_t;


정확히 7이라고 나옵니다.