C 構造体のメモリ アライメント: サイズの不一致を理解する
C 構造体を使用する場合、メモリ アライメントは実際の構造体を決定する上で重要な役割を果たします。メモリ内の構造体のサイズ。メモリ アラインメントとは、特定の境界で分割できるメモリ アドレス内のデータ構造の配置を指します。これにより、効率的なデータ アクセスとパフォーマンスの最適化が保証されます。
メモリ アライメントが通常 4 バイトに設定されている 32 ビット マシンを考えてみましょう。このコンテキストでは、
typedef struct { unsigned short v1; unsigned short v2; unsigned short v3; } myStruct;
のようないくつかの符号なし short メンバーで構成される構造体は、この構造体のメモリ サイズが 8 バイト (3 x 2 バイト) であると予想されます。ただし、sizeof(myStruct) 演算子は 6 バイトのみを返します。この不一致は、アライメント要件に起因する可能性があります。
最初の例では、各 short メンバーは 2 バイトを占有します。アライメント境界は 4 バイトであるため、メンバー間にパディングは挿入されません。したがって、合計サイズは 6 バイトのままです。
対照的に、以下に示すように、int メンバーを構造体に導入すると、アライメント動作が変更されます。
typedef struct { unsigned short v1; unsigned short v2; unsigned short v3; int i; } myStruct;
この場合、 int メンバーには 4 バイトのアライメント境界が必要です。この要件を確実に満たすために、最後の unsigned short メンバー (v3) と int メンバー (i) の間に 2 バイトのパディングが挿入されます。これにより、合計サイズは 12 バイトになります (short のデータが 6 バイト、パディングが 2 バイト、int が 4 バイト)。
したがって、2 つの構造体のメモリ サイズの違いは次のようになります。メンバータイプの調整要件。最初の構造体では、整列境界は short メンバー自体によって満たされますが、2 番目の構造体では、int メンバーの整列境界を満たすために追加のパディングが必要です。
以上が3 つの unsigned short メンバーを持つ構造体に対して、sizeof(myStruct) が 8 バイトではなく 6 バイトを返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。