컴퓨터공부

__packed 키워드

achivenKakao 2009. 2. 23. 22:07

__packed 지시어는 컴파일러에게 데이터들이 바이트 단위로 위치해 있다고 알려줍니다.
구조체 에서 __packed 지시자는 모든 패딩값을 제거하기 위해 사용됩니다.

 
struct {
  char a;
  int b;
  short c;
  char d;
}

위 코드의 경우 리틀엔디안 메모리 시스템에서 아래와 같이 패딩 비트가 들어가게 됩니다.
주소     +3         +2          +1          +0
   +-----------+-----------+-----------+-----------+
+0 |    pad    |    pad    |    pad    |     a     |
   +-----------+-----------+-----------+-----------+
+4 | b[31, 24] | b[23, 16] | b[15, 8]  |  b[7, 0]  |
   +-----------+-----------+-----------+-----------+
+8 |    pad    |     d     | c[15, 8]  |  c[7, 0]  |
   +-----------+-----------+-----------+-----------+

패딩비트가 들어가는 이유는 ARM 아키텍처의 로드-스토어 정렬 제한 때문이죠.

그러나 이런 패딩비트가 들어가면 안되는 경우가 있을 수 있습니다.
그럴때 사용하는것이 __packed 지시어 입니다.

 
__packed struct {
  char a;
  int b;
  short c;
  char d;
}

__packed 지시어가 들어가면 아래와 같이 패딩비트가 사라집니다.
주소     +3         +2          +1          +0
   +-----------+-----------+-----------+-----------+
+0 | b[23, 16] | b[15, 8]  |  b[7, 0]  |     a     |
   +-----------+-----------+-----------+-----------+
+4 |     d     |  c[15, 8] |  c[7, 0]  | b[31, 24] |
   +-----------+-----------+-----------+-----------+

제가 보고 있는 소스를 보니 아래와 같은 코드가 보이는군요.

#if defined( __GNUC__ )
#define PACKED_STRUCT           struct __attribute__ ((__packed__))
#define PACKED_STRUCTEX( x )    struct x __attribute__ ((__packed__))
#elif defined( __arm )
#define PACKED_STRUCT           __packed struct
#define PACKED_STRUCTEX( x )    __packed struct x
#else
#define PACKED_STRUCT           struct
#define PACKED_STRUCTEX( x )    struct x
#endif

VC 에서는 패딩비트를 없애기 위해서 #pragma pack(1) 가 쓰이죠.

+
gcc 에서는 __attribute__ ((__packed__)) armcc 에서는 __packed 를 사용합니다. 같은 의미 입니다. :)


출처 : http://kldp.org/node/71866