11

考虑这个变量声明:

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

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

4

1 回答 1

5

union 的对齐应该没问题,但在 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 个花车。如果您想成为超级偏执狂,您可能可以定义所有相同的对齐特性等,以确保不会破坏任何东西。但是,据我所知,鉴于您在回答中提到了 MSDN,您应该一切顺利。如果你知道你有 SSE 兼容的东西,联合和直接访问它都应该工作。您也可以查看 DirectXMath 标头,以了解 Windows 如何进行定义和自行处理:它们还定义了一些宏,具体取决于编译时存在的内在函数和功能。

编辑:正如 R.MartinhoFernandes 在评论中所说,直接访问它可能比在联合中重新定义它更令人头疼。

于 2013-02-23T20:24:07.293 回答