通过union union访问__m128变量的字节?

Vio*_*ffe 11 c++ sse unions

考虑这个变量声明:

union {
        struct {
            float x, y, z, padding;
        } components;
        __m128 sse;
    } _data;
Run Code Online (Sandbox Code Playgroud)

我的想法是通过赋值x,y,z领域,执行SSE2计算,并通过读取结果x,y,z.不过,我对它是否合法有些怀疑.我关心的是对齐:MSDN说__m128变量自动对齐到16字节边界,我想知道我的联盟是否可以破坏这种行为.这里还有其他陷阱需要考虑吗?

小智 5

联合的对齐应该没问题,但在Windows的情况下,您可以直接访问32位组件.从xmmintrin.h(DirectXMath):

typedef union __declspec(intrin_type) _CRT_ALIGN(16) __m128 {
     float               m128_f32[4];
     unsigned __int64    m128_u64[2];
     __int8              m128_i8[16];
     __int16             m128_i16[8];
     __int32             m128_i32[4];
     __int64             m128_i64[2];
     unsigned __int8     m128_u8[16];
     unsigned __int16    m128_u16[8];
     unsigned __int32    m128_u32[4];
 } __m128;
Run Code Online (Sandbox Code Playgroud)

如你所见,那里有4个花车.如果你想成为超级偏执狂,你可以定义所有相同的对齐特性,以确保不会有任何破坏.然而,据我所知,并且鉴于你在答案中提到了MSDN,你应该都很好.如果你知道你有SSE兼容的东西,联合和直接访问它应该工作.您还可以浏览DirectXMath标头,以了解Windows如何进行定义和争论:它们还定义了一些宏,具体取决于编译时存在哪些内部函数和功能.

编辑:正如R.MartinhoFernandes在评论中所说,直接访问它可能不像在工会中重新定义它那样令人头痛.