1

メンバーごとに構造体の STL ベクトルを簡単に通過する方法はありますか? つまり、次のような構造体があるとします。

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

vectorstd::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 にアクセスするのは本当にばかげた方法だと思いますが、このループはストライドが機能するかどうかを確認するための単なる実験です。

それが役立つ場合は、これを実行して、ポインターとストライドをコンストラクターパラメーターとして独自の内部データ型に渡すライブラリルーチンに渡すことができるようにします。もちろん、コードを 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].xdoubleへのポインタです。あなたはそれに追加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 に答える