C++ 最快的数组结构到数组结构的转换
我有这样一个结构:C++ 最快的数组结构到数组结构的转换,c++,arrays,struct,type-conversion,C++,Arrays,Struct,Type Conversion,我有这样一个结构: struct SoA { int arr1[COUNT]; int arr2[COUNT]; }; struct AoS { int arr1_data; int arr2_data; }; std::vector<AoS> points; 我希望它看起来像这样: struct SoA { int arr1[COUNT]; int arr2[COUNT]; }; struct AoS { int ar
struct SoA
{
int arr1[COUNT];
int arr2[COUNT];
};
struct AoS
{
int arr1_data;
int arr2_data;
};
std::vector<AoS> points;
我希望它看起来像这样:
struct SoA
{
int arr1[COUNT];
int arr2[COUNT];
};
struct AoS
{
int arr1_data;
int arr2_data;
};
std::vector<AoS> points;
关于StackOverflow有一些与SoA/AoS相关的问题,但我还没有找到一个与尽可能快的转换相关的问题。由于结构打包的差异,我看不到任何方法可以避免将数据从一种格式复制到另一种格式,但我希望有人能告诉我有一种方法可以简单地以不同的方式引用数据并避免复制
特别鼓励使用墙外解决方案。SoA和
AoS[]的二进制布局不同
/std::vector
因此,如果不进行复制操作,就无法将二者转换为另一个
您拥有的代码非常接近最优-一个改进可能是预先分配具有预期元素数的向量。或者,尝试使用原始数组构造整个元素和每个属性初始化。更改需要仔细衡量(使用完全优化的构建和预期的数组大小来衡量),并根据代码的可读性/正确性进行加权
如果您不需要精确的二进制布局(在使用vector时似乎是这样),您可以通过创建两个自定义类来实现类似的语法,这些自定义类将以不同的方式公开现有数据。这将避免完全复制
您需要“array”类型(提供对SoA
实例的索引/迭代)和“element”类型(使用referece对SoA实例和索引进行初始化,为该索引处的单独字段公开访问器)
代码草图(添加迭代器,…):
我怀疑你能否“简单地以不同的方式引用数据”,因为它在内存中的排列方式不同。而且你无论如何都需要插入/推送它们,否则你的
向量将不会处于有效状态。请注意,以不同的方式引用数据实际上可能并不比制作副本快。。。当线性读取或写入内存时,RAM缓存是最有效的,执行大量的解引用可能会打破这种模式,导致大量缓存未命中,从而降低执行速度。(也许不是,但关键是要从两个方面来衡量,并准备好当你的直觉与现实不符时感到惊讶)你能扩展你提到的“数组”类型吗?没错,这里的目标不是精确的二进制表示,只是高效地访问元素。我没有想到要用一种习惯iterator@ConnorLawson我添加了一个非常粗糙的示例(可能甚至不会编译…希望比文字更好地说明我的意思)。std::vector
内容与普通的旧数组具有相同的二进制布局。@BenVoigt是的,但我不确定它对转换或公开有何帮助(这似乎是实际目标)在不复制数据的情况下将数组的结构转换为数组的结构。(更新问题以澄清我比较的类型)。