假设我有一个结构:
struct Foo {
float A;
float B;
float C;
};
我有一个结构的载体:
std::vector<Foo> vFoo;
一个带浮点数组的函数(或者与Foo成员类型相同的函数):
float foo_floats(const float a[], const float b[], const float c[]);
我的问题是,有没有办法使用vFoo作为foo_floats的参数?换句话说,是否可以从vFoo 中提取Foo中的A,B和C数组而不用创建其他向量?
我想在下面删除三个新的向量(x,y和z),因为这显然浪费了内存:
std::vector<float> x, y, z;
for (int i=0; i<vFoo.size(); ++i) {
x.push_back(vFoo[i].A);
y.push_back(vFoo[i].B);
z.push_back(vFoo[i].C);
}
const float f = foo_floats(&x[0], &y[0], &z[0]);
答案 0 :(得分:3)
不能直接使用vFoo
给出这些声明,不能。如果您只是想避免额外的分配,您可以就地转置数据(请参阅http://en.wikipedia.org/wiki/In-place_matrix_transposition),但这可能比转置不合适的速度慢。所以你的选择是:
vFoo
成为数组结构(SoA),而不是结构数组(AoS)。foo_floats
以取代AoS而不是SoA。foo_floats
以获取其每个输入参数的“步幅”值,以便它适用于AoS和SoA数据。顺便说一句,如果我无法控制foo_float
,并且只关心表演,我会毫不犹豫地进行不合时宜的换位。我没有使用三个单独的向量,而是使用一个预先调整大小以容纳所有三个组件数组的向量。如果我真的非常担心性能,我会使用SIMD内在函数,一次转置和散布四(或八)个三元组。您可能不需要担心性能。