Data-oriented design is all about reorganizing data for better performance, and Andrew Kelley’s talk on the topic—especially his use of Zig’s MultiArrayList
—offered a compelling real-world example. Inspired by that, this post explores how we can achieve a similar “struct-of-arrays” approach in C++26 using reflection to build a SoaVector<T>
that separates member storage for improved memory locality and performance.
Implementing a Struct of Arrays
by Barry Revzin
From the article:
Recently, I watched Andrew Kelley’s talk on Practical Data Oriented Design. It goes into some of the architectural changes he’s been making to the Zig compiler, with pretty significant performance benefit. Would definitely recommend checking out the talk, even if you’re like me and have never written any Zig.
About halfway through the talk, he shows a way to improve his memory usage by avoiding wasting memory. By turning this structure:
const Monster = struct { anim : *Animation, kind : Kind, const Kind = enum { snake, bat, wolf, dingo, human }; }; var monsters : ArrayList(Monster) = .{};
into this one:
var monsters : MultiArrayList(Monster) = .{};
ArrayList(Monster)
is what we could callstd::vector<Monster>
, andMultiArrayList(Monster)
now stores theanim
s andkind
s in two separate arrays, instead of one. That is, a struct of arrays instead of an array of structs. But it’s a tiny code change.
Add a Comment
Comments are closed.