从向量中提取成员变量的数组

时间:2013-07-17 13:50:07

标签: c++ arrays vector stdvector

假设我有一个结构:

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]);

1 个答案:

答案 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内在函数,一次转置和散布四(或八)个三元组。您可能不需要担心性能。