강좌 & 팁
글 수 2,412
2014.06.09 13:17:45 (*.134.169.166)
42908
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로 출력됩니다. 구조체 데이터를 변수가 차지하는 공간만큼 사용할 때 이용하세요.