SoA
Structure of Arrays_
https://blog.kotet.jp/2017/05/soa-d/
https://en.wikipedia.org/wiki/AoS_and_SoA
gpt-5.icon
SoAと Array of Structures (AoS) は、データをメモリ上にどう配置するかという観点での設計パターンです。特に数値計算・ゲーム・機械学習など、大量のデータを同じ処理で扱う場面で重要な考え方です。
概要
SoA は、各フィールドごとに独立した配列を持ちます。
code:cpp
struct Particles {
float x3;
float y3;
float z3;
float velocity3;
};
Particles particles = {
{1.0, 4.0, 7.0},
{2.0, 5.0, 8.0},
{3.0, 6.0, 9.0},
{0.5, 0.6, 0.7}
};
メモリ上ではこうなります:
code:_
x1 x2 x3y1 y2 y3z1 z2 z3v1 v2 v3
特徴
各属性が連続しているため、キャッシュ効率が良く、SIMD 命令で並列化しやすい。
「全ての x を一気に処理」など、同種データをまとめて計算する場合に圧倒的に高速。
一方で、個々の「粒子」単位で扱う処理(例えば 1 個をコピーするなど)は扱いづらい。
⚙️ 比較まとめ
table:_
観点 Array of Structures (AoS) Structure of Arrays (SoA)
メモリ配置 各オブジェクトごとにすべての属性 属性ごとに独立した配列
キャッシュ効率 劣る(アクセス分散) 良い(連続アクセス)
SIMD最適化 難しい 容易
コードの分かりやすさ 高い 低い(抽象化が必要)
オブジェクト単位操作 得意 不得意
属性単位操作 不得意 得意
🧠 まとめ
AoS は「扱いやすさ・自然さ」
SoA は「性能・効率」
どちらを選ぶかは、「どんなアクセスパターンが多いか」で決まる。