加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 通过union合法访问__m128变量的字节?

发布时间:2020-12-16 04:59:32 所属栏目:百科 来源:网络整理
导读:考虑这个变量声明: union { struct { float x,y,z,padding; } components; __m128 sse; } _data; 我的想法是通过x,z字段分配值,执行SSE2计算,并通过x,z读取结果.对于这是否合法,我有些疑惑.我的关注是对齐:MSDN表示__m128变量自动对齐到16字节的边界,我想
考虑这个变量声明:
union {
        struct {
            float x,y,z,padding;
        } components;
        __m128 sse;
    } _data;

我的想法是通过x,z字段分配值,执行SSE2计算,并通过x,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如何定义和争吵自己:他们还定义了一些宏,取决于编译时存在哪些instrinsics和功能.

编辑:正如R.MartinhoFernandes在评论中所说的那样,直接访问它可能不像在联盟中重新定义一样.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读