1

有没有一种简单的方法可以按成员跨越结构的 STL 向量?换句话说,如果我有这样的结构:

struct foo {
    double x, y, z;
};

在向量std::vector<foo> bar(20)中,我可以跨过数组从每个结构中挑选出 x 吗?

我试过这个,但它似乎不起作用:

for (int i=0; i<20; ++i)
{
   double xx = (&bar[0].x + i*sizeof(bar[0]))->x;
}

为什么那行不通?不sizeof(bar[0])考虑结构之间的填充?

注意:我意识到这是在循环中访问 x 的一种非常愚蠢的方式,但这个循环只是一个实验,看看 stride 是否有效。

如果有帮助,我想这样做,这样我就可以将 bar 传递给一个库例程,该库例程接受一个指针和一个 stride 作为其自己的内部数据类型的构造函数参数。当然,我可以将我的代码从 AoS 转换为 SoA,但我不想这样做,除非我绝对必须这样做。

4

3 回答 3

1

我想我会直接计算步幅,使用类似的东西:

struct point {
    double x, y, z;
};

int main() {
    point points[2];

    std::cout << "stride = " << (char *)(&(points[1].x)) - (char *)(&(points[0].x)) << "\n";
}
于 2013-10-23T14:39:36.157 回答
1

&bar[0].x是一个指向双精度的指针。你正在添加i*sizeof(bar[0])它。

结果是存储在指针中的地址增加了,i*sizeof(bar[0])*sizeof(double)这不是您所期望的。

一个正确的表达是

&bar[0].x + i*sizeof(bar[0])/sizeof(double)
于 2013-10-23T14:41:54.080 回答
0

&bar[0].x 是指向双精度的指针。要添加适当的班次,您需要将其转换为 char*,然后再次加倍 *。

     double xx = *reinterpret_cast<double*>(reinterpret_cast<char*>(&bar[0].x) + i*sizeof(bar[0]));

无论如何,您应该真正考虑使用标准算法来达到您的目的。

于 2013-10-23T14:43:17.283 回答