The SoA Vector – Part 2: Implementation in C++--Sidney Congard
The series continues and end.
The SoA Vector – Part 2: Implementation in C++
by Sidney Congard
From the article:
Like we saw in the first part of this series on SoA, the SoA is a way to organise the data of a collection of objects to optimise the performance of certain use cases: traversing the collection by accessing the same data member of all the objects:
struct person { std::string name; int age; }; std::vector<person> persons = ... for (auto& person : persons) { ++person.age; } struct person { std::string name; int age; }; std::vector<person> persons = ... for (auto& person : persons) { ++person.age; }The SoA in its barest expression is this:
struct persons { std::vector<std::string> names; std::vector<int> ages; }; struct persons { std::vector<std::string> names; std::vector<int> ages; };By putting all the ages next to each other in memory, we optimise the performance of the traversal. But such a structure is not a container in itself, and is in particular not compatible with the STL.
Let’s design an SoA collection with an interface as close as possible to std::vector<persons>, but with the SoA structure of components stored in separate arrays...



re in 2005 and since then is focused on his role as chief engineer designing and developing Plastic SCM and SemanticMerge among other SCM products.