4

doublea のアラインメント要件と type の構造体メンバーの効果的なアラインメントを出力する次の C++ コードを考えてみましょうdouble

#include <iostream>

struct S { short x; double y; };

int main() {
    S s;
    std::cout << __alignof(double) << ' ';
    std::cout << (char*)&s.y - (char*)&s << std::endl;
}

( codepag.org で実行)

x86 で gcc を使用してこのコードをコンパイルしています。

このプログラムが を出力することを期待していましたが8 88 4代わりに出力されます。何故ですか?

4

1 に答える 1

2

オブジェクトの配置は、構造の外側と内側で異なる場合があります。構造体の外側では、最速のアクセスを可能にする最小のアラインメント (たとえば 8 バイト) である可能性があります。ただし、構造内では、パディングが最も少ない値 (x86 では 4 バイト) である可能性があります。一部のコンパイラでは、構造体のパッキングを制御できます (gcc: __attribute__((pack))、microsoft: #pragma pack())

コンパイラが正確に行うことは、システムの ABI によって決定されます。ABI が、構造体の値が 4 バイトを超えるパディングを持たないことを示している場合、コンパイラはこれに従います。

于 2012-07-18T16:42:27.347 に答える