61

重複の可能性:
構造体の sizeof が各メンバーの sizeof の合計と等しくないのはなぜですか?

次の C コードを検討してください。

#include <stdio.h>    

struct employee
{
  int id;
  char name[30];  
};

int main()
{
  struct employee e1;      
  printf("%d %d %d", sizeof(e1.id), sizeof(e1.name), sizeof(e1));
  return(0);
}

出力は次のとおりです。

4 30 36

構造体のサイズが個々のコンポーネント変数のサイズの合計と等しくないのはなぜですか?

4

4 に答える 4

80

コンパイラは、アラインメント要件のためにパディングを追加する場合があります。これは、構造体のフィールド間のパディングに適用されるだけでなく、構造体の末尾にも適用される可能性があることに注意してください (構造体型の配列で各要素が適切に整列されるようにするため)。

例えば:

struct foo_t {
    int x;
    char c;
};

cフィールドにパディングは必要ありませんが、フィールドの後に 3 バイトのパディングが必要になるため、構造体には通常( 32sizeof(struct foo_t) == 8ビット システムではなく、32 ビット型のシステムでは) があります。intc

システム (x86 や Cortex M3 など) ではパディングが必要ない場合がありますが、パフォーマンス上の理由から、コンパイラによってパディングが追加される場合があることに注意してください。

于 2009-12-03T18:23:43.537 に答える
3

デフォルトのアラインメントはおそらく 4 バイトです。30 バイトの要素が 32 になったか、構造全体が次の 4 バイト間隔に切り上げられました。

于 2009-12-03T18:56:19.477 に答える
3

前述のように、C コンパイラはアラインメント要件のためにパディングを追加します。これらの要件は、多くの場合、メモリ サブシステムに関係しています。一部の種類のコンピューターは、4 バイトなどの「適切な」値に並べられたメモリにのみアクセスできます。多くの場合、これは語長と同じです。したがって、C コンパイラは構造体のフィールドをこの値に合わせてアクセスしやすくすることがあります (たとえば、4 バイトの値は 4 バイトに揃える必要があります)。 . 他にも理由があると思います。詳細については、このウィキペディアのページを参照してください。

于 2009-12-03T18:33:44.467 に答える
2

6 バイトにアラインすることは、アドレスの倍数から 4 にアラインしているため、奇妙ではありません。

したがって、基本的に構造体には 34 バイトがあり、次の構造体はアドレスに配置する必要があります。つまり、4 の倍数です。34 の後の最も近い値は 36 です。そして、このパディング領域は構造体のサイズにカウントされます。

于 2009-12-03T18:29:57.623 に答える