最快可能的阵列结构到阵列转换

Con*_*son 5 c++ arrays struct type-conversion

我有一个看起来像这样的结构:

struct SoA
{
    int arr1[COUNT];
    int arr2[COUNT];
};
Run Code Online (Sandbox Code Playgroud)

我希望它看起来像这样:

struct AoS
{
    int arr1_data;
    int arr2_data;
};

std::vector<AoS> points;
Run Code Online (Sandbox Code Playgroud)

尽快.必须保留订单.

AoS单独构建每个对象并以最快的方式将其推回去,还是有更快的选择?

SoA before;
std::vector<AoS> after;

for (int i = 0; i < COUNT; i++)
    points.push_back(AoS(after.arr1[i], after.arr2[i]));
Run Code Online (Sandbox Code Playgroud)

StackOverflow上有与SoA/AoS相关的问题,但我没有找到与最快转换相关的问题.由于结构填充的差异,我无法看到任何方法来避免将数据从一种格式复制到下一种格式,但我希望有人可以告诉我,有一种方法可以简单地引用数据并避免复制.

特别鼓励离墙解决方案.

Ale*_*kov 5

二进制布局SoAAoS[]/ std::vector<AoS>是不同的,所以没有复制操作就没有办法将一个转换为另一个.

您拥有的代码非常接近最佳 - 一个改进可能是预先分配具有预期元素数量的向量.或者尝试使用构造整个元素和每个属性初始化的原始数组.需要仔细测量更改(明确使用您期望的数组大小进行完全优化的构建测量)并根据代码的可读性/正确性进行加权.

如果您不需要精确的二进制布局(在您使用向量时似乎就是这种情况),您可以通过创建将以不同方式公开现有数据的几个自定义类来实现具有相似外观的语法.这样可以避免完全复制.

您将需要"数组"类型(提供实例的索引/迭代SoA)和"元素"类型(使用参考SoA和索引实例初始化,为该索引处的单独字段公开访问器)

粗略的代码草图(添加迭代器,...):

class AoS_Element
{
   SoA& soa; 
   int index;
 public:
   AoS_Element(SoA& soa, int index) ...
   int arr1_data() { return soa.arr1[index];}
   int arr2_data() { return soa.arr2[index];}
}

class AoS
{
    SoA& soa;
public: 
    AoS(SoA& _soa):soa(_soa){}
    AoS_Element operator[](int index) { return AoS_Element(soa, index);}
}
Run Code Online (Sandbox Code Playgroud)