Переключение между массивом структур (AoS) и структурой массивов (SoA)
Одна особенность, которая играет важную роль во многих работах по проектированию, ориентированному на данные, заключается в том, что во многих случаях вместо AoS (массива структур):
struct C_AoS {
int foo;
double bar;
};
std::vector<C_AoS> cs;
...
std::cout << cs[42].foo << std::endl;
более эффективно упорядочить данные в SoA (структура массивов):
struct C_SoA {
std::vector<int> foo;
std::vector<double> bar;
};
C_SoA cs;
...
std::cout << cs.foo[42] << std::endl;
Теперь то, что я ищу, - это решение, которое позволило бы мне переключаться между AoS и SoA без изменения вызывающего интерфейса, то есть, что я мог, с минимальными усилиями и без дополнительных затрат времени выполнения (по крайней мере, до чрезмерной косвенности), например, позвонитеcs[42].foo;
независимо от того, какое расположение данных я использую.
Я должен отметить, что приведенный выше пример синтаксиса является идеальным случаем, который вполне может быть невозможным, но я бы также был очень заинтересован в близких приближениях. Любой берущий?