강좌 & 팁
하나 이상의 요소로 구성된 데이터를 송수신하기 위해서는 스트럭쳐를 구성하는 것이 좋습니다.
바이트 단위로 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이라고 나옵니다.