C 構造体のメモリ アライメントを理解する
メモリ アライメントは、データがメモリに格納され、プロセッサによってアクセスされます。構造体のコンテキストでは、メモリ アライメントは、構造体の個々のメンバーがメモリ内でどのようにレイアウトされるかを決定します。
次の構造体を考えてみましょう:
<code class="c">typedef struct { unsigned short v1; unsigned short v2; unsigned short v3; } myStruct;</code>
メモリ アライメントが行われる 32 ビット マシンでは、通常、4 バイトに設定されている場合、この構造体の合計サイズは 8 バイトであると予想されます。ただし、sizeof(myStruct) 演算子は 6 バイトのみを返します。
構造体の各メンバーは unsigned short であり、サイズが 2 バイトであるため、矛盾が生じます。すべてのメンバーは同じサイズであるため、メンバー間にパディングは挿入されません。結果として、構造体はメモリ内で 6 バイトを占有します。
次に、構造体を変更しましょう:
<code class="c">typedef struct { unsigned short v1; unsigned short v2; unsigned short v3; int i; } myStruct;</code>
この場合、サイズが 1 の int メンバーが存在します。 4 バイト、構造体のメモリ アライメントを変更します。 int メンバーは 4 バイト境界に配置する必要があります。前に 6 バイトがあるため、v3 と i の間に 2 バイトのパディングが挿入されます。これにより、sizeof(myStruct) で確認できるように、構造体の合計サイズは 12 バイトになります。
要約すると、C 構造体のメモリ アライメントにより、メンバーがメモリ内で適切にアライメントされ、プロセッサのパフォーマンスが最適化され、メモリ使用量が削減されます。 。型は、型自体と同じ大きさの境界にのみ位置合わせされます。より大きな型が導入されると、構造体全体の位置合わせが設定され、必要な位置合わせを維持するためにパディングが導入される可能性があります。
以上が短いメンバーを含む C 構造体のサイズが必ずしもメンバー サイズの倍数にならないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。