1. ホーム
  2. c

[解決済み】構造体パディングとパッキング

2022-04-01 23:19:19

質問

考えてみてください。

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

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

構造体の大きさはそれぞれ12と8である。

これらの構造は、水増しされていますか、それとも詰め込まれていますか?

パディングやパッキングはいつ行われるのですか?

解決方法は?

パディング アライメント 構造体のメンバを、"natural" アドレスの境界線に合わせる - と言うことです。 int のメンバーはオフセットを持つことになり、そのオフセットは mod(4) == 0 32ビットプラットフォームでは パディングはデフォルトでオンになっています。これは、最初の構造体に次のような "gaps"を挿入します。

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;

パッキン 一方、GCCでは、コンパイラがパディングを行うことはできません。これは、明示的に要求されなければなりません。 __attribute__((__packed__)) ということで、以下のようになります。

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

というサイズの構造体を生成します。 6 32ビットアーキテクチャの場合。

ただし、不整列メモリアクセスが可能なアーキテクチャ (x86 や amd64 など) では速度が低下します。 ストリクトアライメントアーキテクチャ SPARCのような。