考虑以下变量声明:

union {
        struct {
            float x, y, z, padding;
        } components;
        __m128 sse;
    } _data;

我的想法是通过xyz字段分配值,执行SSE2计算并通过xyz读取结果。不过,对于它是否合法,我有些怀疑。我关心的是对齐:MSDN说__m128变量自动对齐到16个字节的边界,我想知道我的联合是否可以破坏此行为。
还有其他陷阱要考虑吗?

最佳答案

并集的对齐方式应该很好,但是在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;

如您所见,其中有4个浮标。如果您想成为 super 偏执狂,则可以定义所有相同的对齐方式专长,以确保不会破坏任何对齐方式。据我所知,鉴于您在回答中提到了MSDN,因此您应该一切顺利。如果您知道自己具有SSE兼容的东西,则该联合和直接访问它都应该起作用。您也可以在DirectXMath header 周围进行摸索,以了解Windows如何进行定义和调整自身:它们还定义了一些宏,具体取决于编译时存在的内在函数和功能。

编辑:正如R.MartinhoFernandes在评论中所说,直接访问它可能比在工会中重新定义它要容易得多。

07-24 09:45
查看更多