考虑这个变量声明:
union {
struct {
float x, y, z, padding;
} components;
__m128 sse;
} _data;
我的想法是通过x
,y
,z
字段分配值,执行SSE2计算并通过x
,y
读取结果, z
。不过,我对它是否合法有些怀疑。我关心的是对齐:MSDN说__m128
变量自动对齐到16字节边界,我想知道我的联盟是否可以破坏这种行为。
这里还有其他陷阱需要考虑吗?
答案 0 :(得分: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在评论中所说,直接访问它可能不像在联盟中重新定义它那样令人头痛。