gpt4 book ai didi

c++ - 通过 union 合法访问 __m128 变量的字节吗?

转载 作者:可可西里 更新时间:2023-11-01 15:24:27 28 4
gpt4 key购买 nike

考虑这个变量声明:

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

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

最佳答案

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

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

关于c++ - 通过 union 合法访问 __m128 变量的字节吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15045132/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com