【发布时间】:2015-07-10 20:34:40
【问题描述】:
我的结构如下所示:
struct SoA
{
int arr1[COUNT];
int arr2[COUNT];
};
我希望它看起来像这样:
struct AoS
{
int arr1_data;
int arr2_data;
};
std::vector<AoS> points;
尽快。必须保持秩序。
是单独构造每个 AoS 对象并将其推回执行此操作的最快方法,还是有更快的选择?
SoA before;
std::vector<AoS> after;
for (int i = 0; i < COUNT; i++)
points.push_back(AoS(after.arr1[i], after.arr2[i]));
StackOverflow 上有与 SoA/AoS 相关的问题,但我没有找到与最快可能转换相关的问题。由于结构打包差异,我看不到任何方法可以避免将数据从一种格式复制到另一种格式,但我希望有人能告诉我有一种方法可以简单地以不同方式引用数据并避免复制。
特别鼓励采用现成的解决方案。
【问题讨论】:
-
我怀疑你可以“简单地以不同的方式引用数据”,因为它在内存中的排列方式不同。
-
无论如何您都需要插入/推送它们,否则您的
vector将处于无效状态。 -
请注意,以不同方式引用数据实际上可能并不比复制更快... RAM 缓存在线性读取或写入内存时最有效,并且执行大量取消引用可能会破坏这种情况模式,导致大量缓存未命中,因此执行速度较慢。 (也许不是,但关键是要从两个方面进行衡量,并准备好在你的直觉与现实不符时感到惊讶)
标签: c++ arrays struct type-conversion