2

構造の整列とパッキングは初めてです。理解したつもりでしたが、予想外の結果がいくつか見つかりました (以下を参照)。

構造のアライメントに関する私の理解は次のとおりです。

  1. 型は通常、そのサイズの倍数であるメモリ アドレスに配置されます。

  2. 適切な配置を容易にするために、必要に応じてパディングが追加されます

  3. 構造体の末尾は、最大要素の倍数になるようにパディングする必要があります (配列へのアクセスを容易にするため)。

この#pragma packディレクティブは基本的に、型のサイズに基づいて配置する一般的な規則をオーバーライドできます。

#pragma pack(push, 8)
struct SPack8
{
  // Assume short int is 2 bytes, double is 8 bytes, and int is 4 bytes
  short int a;
  double b;
  short int c;
  int d;
};
#pragma pack(pop)

Pseudo struct layout: What I expected:
// note: PADDING IS BRACKETED
0, 1, [2, 3, 4, 5, 6, 7] // a occupies address 0, 1
8, 9, 10, 11, 12, 13, 14, 15, // b occupies 8-15 inclusive
16, 17, [18, 19, 20, 21, 22, 23] // c occupies 16-17 inclusive
24, 25, 26, 27 // d occupies 24-27 inclusive
// Thus far, SPack8 is 28 bytes, but the structure must be a multiple of
// sizeof(double) so we need to add padding to make it 32 bytes
[28, 29, 30, 31]

驚いたことに、VS 2015 x86 では sizeof(SPack8) == 24 です。d が 8 バイトのアドレスにアラインされていないようです。

offsetof(SPack, a) // 0, as expected
offsetof(SPack, b) // 8, as expected
offsetof(Spack, c) // 16, as expected
offsetof(SPack, d) // 20..what??

誰かが何が起こっているのか/私が誤解していることを説明してもらえますか?

ありがとうございました!

4

1 に答える 1