跨越结构向量的成员

时间:2013-10-23 14:30:11

标签: c++ vector struct

是否有一种简单的方法可以通过成员跨越结构的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是一种非常愚蠢的方法,但这个循环只是一个实验,看看步幅是否有效。

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

3 个答案:

答案 0 :(得分:1)

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

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

int main() {
    point points[2];

    std::cout << "stride = " << (char *)(&(points[1].x)) - (char *)(&(points[0].x)) << "\n";
}

答案 1 :(得分:1)

&bar[0].x是指向double的指针。您正在向其添加i*sizeof(bar[0])

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

正确的表达是

&bar[0].x + i*sizeof(bar[0])/sizeof(double)

答案 2 :(得分:0)

&amp; bar [0] .x是指向double的指针。要添加适当的移位,您需要将其转换为char *,然后再加倍*。

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

在任何情况下,您都应该考虑使用标准算法。