Visual C++では、構造体メンバのアライメントに影響するコンパイラスイッチ(/Zp
)とpack
プラグマの両方が用意されています。しかし、私は彼らがどのように動作するかについていくつかの誤解を持っているようです。 MSDNによればVisual C++での構造体の整列
、部材の位置合わせは、nの 複数またはメンバーのサイズの倍数のいずれかである境界になり、所与のアライメント値のためにN、
、方 が小さい。
パックの値を8バイト(デフォルト)としましょう。構造体内では、サイズが8バイト未満のメンバーは、それ自身のサイズの倍数のオフセットになると思います。サイズが8バイト以上のメンバーは、8バイトの倍数のオフセットになります。 Foo
構造のサイズが12バイトである
#include <tchar.h>
#pragma pack(8)
struct Foo {
int i1;
int i2;
char c;
};
struct Bar {
char c;
Foo foo;
};
int _tmain(int argc, _TCHAR* argv[]) {
int fooSize = sizeof(Foo); // yields 12
Bar bar;
int fooOffset = ((int) &bar.foo) - ((int) &bar); // yields 4
return 0;
}
:
今すぐ次のプログラムを取ります。だからBar
の中では、私はFoo
メンバがオフセット8(8の倍数)にあると予想していますが、実際にはオフセット4になります。なぜですか?
また、Foo
は実際には4 + 4 + 1 = 9バイトのデータしか持っていません。コンパイラは、最後にパディングバイトを自動的に追加します。しかし、8バイトのアライメント値が与えられても、4の代わりに8の倍数にパディングすべきではありませんか?
ご理解ください!
あなたの 'int'は4バイトだけですか?これを実行しているマシンは何ですか? –
@トニー:32ビットアプリケーションです。 intが4ではなく8バイトだった場合、2つのFooは12バイトしかできませんでした。:-) –