__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 #endifVC 에서는 패딩비트를 없애기 위해서 #pragma pack(1) 가 쓰이죠.
+
gcc 에서는 __attribute__ ((__packed__)) armcc 에서는 __packed 를 사용합니다. 같은 의미 입니다. :)
출처 : http://kldp.org/node/71866