C 構造体のメモリ アライメント: サイズの不一致を理解する
C 構造体を使用する場合、メモリ アライメントは実際のサイズを決定する上で重要な役割を果たします。メモリ内の構造体のサイズ。メモリ アライメントとは、特定の境界で分割できるメモリ アドレス内のデータ構造の配置を指します。これにより、効率的なデータ アクセスとパフォーマンスの最適化が保証されます。
メモリ アライメントが通常 4 バイトに設定されている 32 ビット マシンを考えてみましょう。このコンテキストでは、次のようないくつかの符号なし short メンバーで構成される構造体です。
typedef struct { unsigned short v1; unsigned short v2; unsigned short v3; } myStruct;
この構造体のメモリ サイズは 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;
したがって、2 つの構造体のメモリ サイズの違いは次のようになります。メンバータイプの調整要件。最初の構造体では、整列境界は short メンバー自体によって満たされますが、2 番目の構造体では、int メンバーの整列境界を満たすために追加のパディングが必要です。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3