2011-03-29 9 views
25

私は、マイクロチップC30コンパイラのために書かれたいくつかのCコードもののつもりですし、私は多くの場合、以下のように定義された構造体を参照してください。Cの「パック」構造とは何ですか?

typedef struct __attribute__((__packed__)) 
{ 
    IP_ADDR  MyIPAddr;    // IP address 
    IP_ADDR  MyMask;     // Subnet mask 
    IP_ADDR  MyGateway;    // Default Gateway 
     // etc... 
} APP_CONFIG; 

何詰め込まないことを意味しますか?

答えて

47

構造体が定義されている場合、コンパイラはパディング(実際のデータなしのスペース)を追加できるため、メンバーはCPUのアクセスが容易なアドレス境界に入ります。

たとえば、32ビットCPUの場合、効率的にアクセス(読み書き)するには、32ビットのメンバーは4バイトの倍数のアドレスから開始する必要があります。第二部材は、適切なアドレス境界内に収まるように、以下の構造定義は、両部材の間に16ビットのパディングを追加します

struct S { 
    int16_t member1; 
    int32_t member2; 
}; 

構造上構造のメモリに32ビットアーキテクチャであり、( =パディング):構造がパックされている場合

+---------+---------+ 
| m1 |~~~~| m2 | 
+---------+---------+ 

、これらのパディングが挿入されていません。コンパイラは、整列されていないデータメンバを抽出し、それらに書き込むために、より遅く実行するコードを生成する必要があります。それはstructのメンバー間のいずれかのパディングを追加しないようにコンパイラに指示し

+---------+---------+ 
| m1 | m2 |~~~~ 
+---------+---------+ 
+0

接種の問題ですが、物事が遅くなると、なぜパック構造が作成されますか?それはメモリのフットプリントを減らすことですか? – damned

3

:詰まったときに

同じ構造、のようなものとして記憶に表示されます。

たとえば、this pageを参照してください。

+0

私はあなたが反対の - パッディングを省略し、それを追加しないことを意味すると思います。もちろん@flolo – flolo

+0

。タイプミスを指摘してくれてありがとう。 – NPE

+0

この回答のリンクは壊れていますが、修正する可能性はありますか? – Kev

1

_attribute__((__packed__))は「おそらく」「物事を速くするためにパディングを挿入しない」ことを意味し、「アライメントを維持するためにアライメントを挿入しない」ことを意味する場合もあります。

関連する問題