gpt4 book ai didi

c++ - 从 vector 中提取成员变量的数组

转载 作者:行者123 更新时间:2023-11-30 02:53:43 25 4
gpt4 key购买 nike

假设我有一个结构:

struct Foo {
float A;
float B;
float C;
};

我有一个结构 vector :

std::vector<Foo> vFoo;

还有一个接受 float 组的函数(或任何与 Foo 成员相同类型的函数):

float foo_floats(const float a[], const float b[], const float c[]);

我的问题是,有没有办法使用 vFoo 作为 foo_floats 的参数?换句话说,是否可以从 vFoo 中提取 Foo 中的 A、B 和 C 数组而不创建额外的 vector ?

我想去掉下面的三个新 vector (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]);

最佳答案

根据这些声明,不可能直接使用 vFoo,不。如果您只是想避免额外的分配,您可以就地转置数据(请参阅 http://en.wikipedia.org/wiki/In-place_matrix_transposition ),但这可能比不在适当的地方转置要慢。所以你的选择是:

  • 您目前的做法。
  • 就地转置。
  • 重写您的代码,使 vFoo 成为数组结构 (SoA) 而不是结构数组 (AoS)。
  • 重写 foo_floats 以采用 AoS 而不是 SoA。
  • 重写 foo_floats,为其每个输入参数取一个“步幅”值,使其适用于 AoS 和 SoA 数据。

顺便说一句,如果我无法控制 foo_float,并且只关心性能,我会毫不犹豫地进行异地换位。我不会使用三个单独的 vector ,而是使用一个预先确定大小的 vector 来容纳所有三个分量数组。如果我真的真的很担心性能,我会用 SIMD 内在函数来做,一次转置和分散四个(或八个)三元组。您可能不需要那么关心性能。

关于c++ - 从 vector 中提取成员变量的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17701602/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com