web-dev-qa-db-ja.com

Cの構造体のサイズ

可能性のある複製:
構造体の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

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

41
user191776

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

例えば:

_struct foo_t {
    int x;
    char c;
};
_

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

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

59
Michael Burr

前述のように、Cコンパイラはアライメント要件にパディングを追加します。多くの場合、これらの要件はメモリサブシステムに関係しています。一部のタイプのコンピューターは、4バイトなどの「ナイス」値まで並んだメモリーにのみアクセスできます。多くの場合、これは単語の長さと同じです。したがって、Cコンパイラは、構造内のフィールドをこの値に揃えて、アクセスしやすくします(たとえば、4バイトの値は4バイトに揃える必要があります)。 。他にも理由があると思います。詳細は this wikipedia pageで見つけることができます。

3

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

2
Liz Albin

6バイトに整列するのは奇妙なことではありません。複数のアドレスに4に整列するからです。

したがって、基本的に構造体には34バイトがあり、次の構造体は4の倍数であるアドレスに配置する必要があります。34の後の最も近い値は36です。

1
avp