¿Es posible acceder a los valores internos en una variable __m128 como atributo en una clase de C ++?

Me gustaría tener una clase Vector (que representa el vector de 3 flotadores) implementada con SSE intrínsicos (por lo que no usaré los 4tos elementos del tipo __m128). Pero me gustaría poder acceder a ellos fácilmente como atributos: así myVector.x accederá a los 0-31 bits en vec, myVector.y accederá a los 32-63 bits en vec, pero sin tener que llamar a algunos getX () método. El atributo ‘x’ sería una especie de alias para los 0-31 bits de ‘vec’. Es posible ?

class Vector { public: float x; float y; float z; private: __m128 vec; } 

No, porque esto viola la regla de aliasing fuerte .

Claro que puedes usar moldes o uniones para simular que __m128 es una variedad de flotadores, pero el optimizador no mantendrá la coherencia para ti, porque estás rompiendo las reglas del idioma.

Ver ¿Qué es la regla estricta de aliasing?

(De acuerdo con la regla, el acceso mediante una unión es seguro, pero eso solo se aplica cuando se está nombrando la unión. Tomar un puntero o una referencia a un miembro de la unión y luego usar el puntero o la referencia directamente no es seguro).

Tal vez podrías usar un sindicato , algo como

 union data { float[4] xyz; __m128 vec; } aVec; 

Entonces los flotadores serían aVec.xyz[0] , aVec.xyz[1] , y aVec.xyz[2] y el __m128 sería aVec.vec . La matriz float tiene cuatro elementos aquí, pero nada dice que tengas que usar el cuarto.