39

Microchip C30コンパイラ用に記述されたCコードをいくつか調べますが、構造体が次のように定義されていることがよくあります。

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

パックとはどういう意味ですか?

4

5 に答える 5

85

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

たとえば、32 ビット CPU では、効率的にアクセス (読み取りおよび書き込み) するために、32 ビット メンバは 4 バイトの倍数であるアドレスから開始する必要があります。次の構造体定義は、2 番目のメンバーが適切なアドレス境界に収まるように、両方のメンバー間に 16 ビットのパディングを追加します。

struct S {
    int16_t member1;
    int32_t member2;
};

32 ビット アーキテクチャでの上記の構造体のメモリ内の構造体は次のとおりです ( ~ = パディング)。

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

構造体がパックされると、これらのパディングは挿入されません。コンパイラは、アラインされていないデータ メンバーを抽出し、それらに書き込むために、より多くのコード (実行速度が遅くなります) を生成する必要があります。

同じ構造がパックされると、次のようにメモリに表示されます。

+---------+---------+
| m1 |   m2    |~~~~
+---------+---------+
于 2011-03-29T13:24:44.637 に答える
8

のメンバー間にパディングを追加しないようにコンパイラに指示しますstruct

たとえば、このページを参照してください。

于 2011-03-29T13:24:52.400 に答える
1

_attribute__((__packed__))(おそらく)「処理を高速化するためにパディングを挿入しない」ことを意味し、「配置を維持するために配置を挿入しない」ことを意味する場合もあります。

于 2011-03-29T13:45:27.477 に答える