ホームページ  >  記事  >  バックエンド開発  >  `sizeof(myStruct2)` は 12 バイトを返し、`sizeof(myStruct1)` は 6 バイトを返すのはなぜですか?

`sizeof(myStruct2)` は 12 バイトを返し、`sizeof(myStruct1)` は 6 バイトを返すのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-26 10:01:03398ブラウズ

Why Does `sizeof(myStruct2)` Return 12 Bytes While `sizeof(myStruct1)` Returns 6 Bytes?

C 構造体のメモリ アライメント

C で構造体を扱う場合、メモリ アライメントはメモリの使用量とパフォーマンスを最適化する上で重要な役割を果たします。次の 2 つの構造体のメモリ アライメントの違いに困惑している場合:

<code class="c">typedef struct {
    unsigned short v1;
    unsigned short v2;
    unsigned short v3;
} myStruct1;

typedef struct {
    unsigned short v1;
    unsigned short v2;
    unsigned short v3;
    int i;
} myStruct2;</code>

ここで、myStruct1 と myStruct2 は両方とも 6 バイトの同じ結合データ サイズを持ちますが、myStruct2 は次を使用して 12 バイトのサイズを報告します。 sizeof() の場合、答えはメモリ アライメントにあります。

ほとんどの 32 ビット マシンでは、アライメント境界は通常 4 バイトです。これは、構造体が 4 バイトの最も近い倍数にアライメントされることを意味します。 myStruct1 では、各メンバーは 2 バイトであるため、メンバー間にパディングは挿入されず、実際のサイズは 6 バイトのままです。

ただし、myStruct2 では、4 バイトの整数 (int) を追加する必要があります。 4 バイトのアライメント境界。元の構造体のデータの最初の 6 バイトは 4 バイト境界に整列していないため、v3 と i の間に 2 バイトのパディングが挿入されます。このパディングにより、i が 4 バイト境界で始まることが保証され、myStruct2 の合計サイズは 12 バイトになります。

ほとんどの場合、構造体は最大のメンバーの境界にのみ位置合わせされることに注意してください。この場合、myStruct2 の int メンバーによってアライメント境界が決定されます。これにより、2 つの構造体のメモリ アライメントの違いが説明されます。

以上が`sizeof(myStruct2)` は 12 バイトを返し、`sizeof(myStruct1)` は 6 バイトを返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。