1

假设我有一个结构:

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

1 回答 1

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

于 2013-07-17T14:33:04.567 回答