10

簡単な質問です。最初にコードします。

struct A {
    int x; 
};
struct B {
    bool y;
};
struct C {
    int x;
    bool y;
};

メイン関数で、私は呼び出します

cout << " bool : " << sizeof(bool) <<
     "\n int : " << sizeof(int) <<
     "\n class A : " << sizeof(A) <<
     "\n class B : " << sizeof(B) <<
     "\n class C : " << sizeof(C) << "\n";

そして結果は

bool : 1
int : 4
class A : 4
class B : 1
class C : 8

クラス C のサイズが 5 ではなく 8 であるのはなぜですか? これは、MINGW 4.7 / Windows 7 / 32 ビット マシンで gcc を使用してコンパイルされることに注意してください。

4

3 に答える 3

9

アグリゲートのアラインメントは、その最も厳密なメンバー(アラインメント要件が最大のメンバー)のアラインメントです。言い換えると、構造のサイズは、最も厳密な(最大の位置合わせ要件を持つ)メンバーの位置合わせの倍数です。

struct D
{
  bool a;
  // will be padded with char[7]
  double b; // the largest alignment requirement (8 bytes in my environment)
};

16は8の倍数であるため、上記の構造体のサイズは16バイトになります。この例では、最も厳密な型は4バイトに整列するintです。そのため、構造体は8バイトになるようにパディングされます。別の例を示します。

struct E
{
  int a;
  // padded with char[4]
  double b;
};

上記の構造のサイズは16です。16は8の倍数です(私の環境ではdoubleの配置)。

より詳細な説明のために、メモリアライメントに関するブログ投稿を書きました http://evpo.wordpress.com/2014/01/25/memory-alignment-of-structures-and-classes-in-c-2/

于 2012-10-02T01:33:28.287 に答える
2

構造体をワードのサイズ (ここでは 4 バイト) に合わせます。

于 2012-10-02T01:06:06.633 に答える
-1

構造体の定義を見ると、1バイトの値の後に4バイトの整数が続きます。この整数は4バイト境界に割り当てる必要があります。これにより、コンパイラは1バイトのブール値の後に3バイトのパディングを挿入します。これにより、構造体のサイズは8バイトになります。これを回避するには、構造体の要素の順序を変更できます。

また、異なる値を返す2つのsizeof呼び出しの場合、ここにタイプミスがなく、ポインターのサイズ、異なるタイプ、または整数変数を使用していないことを確認してください。

構造体サイズについてRohitJが回答したのは、typedefバージョンとは異なりますか?

于 2012-10-02T01:10:43.397 に答える