構造のパディングとパッキング 質問する

構造のパディングとパッキング 質問する

考慮する:

struct mystruct_A
{
   char a;
   int b;
   char c;
} x;

struct mystruct_B
{
   int b;
   char a;
} y;

構造物のサイズはそれぞれ 12 と 8 です。

これらの構造物はパッド入りですか、それとも詰め物入りですか?

パディングや梱包はいつ行われますか?

ベストアンサー1

パディング 整列する構造体のメンバーを「自然な」アドレス境界にマッピングします。つまり、intメンバーには 32 ビット プラットフォーム上のオフセットがありますmod(4) == 0。パディングはデフォルトでオンになっています。これにより、最初の構造体に次の「ギャップ」が挿入されます。

struct mystruct_A {
    char a;
    char gap_0[3]; /* inserted by compiler: for alignment of b */
    int b;
    char c;
    char gap_1[3]; /* -"-: for alignment of the whole struct in an array */
} x;

一方、をパッキングする__attribute__((__packed__))と、コンパイラーがパディングを行うことができなくなります。これは明示的に要求する必要があります。GCC では であるため、次のようになります。

struct __attribute__((__packed__)) mystruct_A {
    char a;
    int b;
    char c;
};

632 ビット アーキテクチャ上でサイズの構造体を生成します。

ただし、注意点として、アラインされていないメモリ アクセスは、それを許可するアーキテクチャ (x86 や amd64 など) では遅くなり、SPARC などの厳密なアラインメント アーキテクチャでは明示的に禁止されます。

おすすめ記事