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 サイトの他の関連記事を参照してください。