考虑这个变量声明:
union {
struct {
float x, y, z, padding;
} components;
__m128 sse;
} _data;
我的想法是通过分配值x
, y
, z
字段,执行 SSE2 计算并通过读取结果x
, y
, z
。不过,我对这是否合法有些怀疑。我关心的是一致性: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 个花车。如果你想成为超级偏执狂,你可能可以定义所有相同的对齐特性,以确保不会出现任何问题。然而,据我所知,鉴于您在回答中提到了 MSDN,您应该一切顺利。如果你知道你有 SSE 兼容的东西,那么联合和直接访问它都应该可以工作。您还可以浏览 DirectXMath 标头,了解 Windows 如何进行定义和处理自身:它们还定义了一些宏,具体取决于编译时存在哪些内在函数和功能。
编辑:正如 R.Martinho Fernandes 在评论中所说,直接访问它可能比在联合中重新定义它要简单得多。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)