2

私はコードを持っています:

class Vector4
{

public:
    union
    {
        float x,y,z,w;
        float v[4];
    };

    Vector4(float _x, float _y, float _z, float _w)
    : x(_x), y(_y), z(_z), w(_w)
    {
        std::cout << "Vector4 constructor: " << this->x << "; " << this->y << "; " << this->z << "; " << this->w << std::endl;
    }
};

私が覚えているように、VC 7.1 ではすべて問題ありませんでしたが、VC 2010 では次の警告が表示されました。

警告 C4608: 'Vector4::y' は、初期化子リスト 'Vector4::::Vector4::x' 内の別の共用体メンバーによって既に初期化されています

そして、私が書くとき:

Vector4 vec(1.0f, 0.0f, 0.0f, 0.0f);

コンソールに表示されます:

Vector4 コンストラクター: 0; 0; 0; 0

教えてください、何が起こっているのですか?

4

1 に答える 1

10

x,y,z,wすべてを互いに結合しました。結合のすべての要素が同じメモリ アドレスで始まるため、4 つの float はすべて同じメモリ空間を共有します。

代わりに、次のように、すべてのベクター要素を構造体に配置します。

union {
    struct { float x, y, z, w; };
    float v[4];
};
于 2012-09-29T20:47:28.677 に答える