構造体のメモリレイアウト
C/C では、構造体を定義するときに、メンバがメモリ上で連続して割り当てられるとは限りません。これは構造体のパディングの結果です。たとえば、次のテスト構造について考えてみましょう。
<code class="c">struct test { double height; int age; char gender; }</code>
A.height、A.age、および A.gender は論理的に順番に現れる可能性がありますが、隣接するメモリ位置を占有しない可能性があります。これは、コンパイラがメンバー間にパディングを挿入して特定の境界に位置合わせし、メモリ アクセスの高速化を最適化する場合があるためです。
配列を含む構造体のレイアウト
配列の構造 (SoA) は、構造の配列 (AoS) の構造とは異なります。
SoA:
<code class="text">----------------------------------------------------------------------------------- | double | double | double | *pad* | int | int | int | *pad* | char | char | char | -----------------------------------------------------------------------------------</code>
SoA では、メンバーはタイプごとにグループ化されます。配列間にパディングあり。これにより、複数のインスタンスにわたる特定のタイプの要素へのアクセスを伴う操作の効率が向上します。
AoS:
<code class="text">----------------------------------------------------------------------------------- | double | int | char | *pad* | double | int | char | *pad* | double | int | char | -----------------------------------------------------------------------------------</code>
AoS では、構造は次のように連続して保存されます。各構造内のパディング。このレイアウトは人間が読みやすいように単純化されていますが、同じメンバーの複数のインスタンスにまたがる要素にアクセスする場合のパフォーマンスが低下する可能性があります。
以上がC/C の配列構造体 (SoA) と構造体配列 (AoS) では、メモリ レイアウトはどのように異なりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。