Одна особенность, которая играет заметную роль во многих работах по проектированию, ориентированному на данные, заключается в том, что во многих случаях вместо 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;
независимо от того, какое расположение данных я использую.
Я должен отметить, что приведенный выше пример синтаксиса является идеальным случаем, который вполне может быть невозможен, но меня также очень интересуют близкие приближения. Есть берущие?