You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否将返回__m128i的intrinsic函数结果赋值给__m128i_u类型变量

你提到的代码如下:

__m128i_u* avxVar = (__m128i_u*)Var;  // Var 由alloc分配内存
*avxVar = _mm_set_epi64(...);         // 将__m128i赋值给__m128i_u是否合法
合法性结论

这个赋值操作完全合法,不存在类型层面的未定义行为,可以正常运行。

原理说明
  • __m128i是标准的128位整数SIMD类型,编译器默认要求其对应的内存地址必须16字节对齐,访问未对齐地址会触发异常或未定义行为。
  • __m128i_u是GCC、Clang、ICC等主流x86编译器提供的非对齐版本别名类型,底层存储结构、位宽和__m128i完全一致,唯一区别是编译器不会对其指向的内存做对齐校验,对应的读写操作会自动生成非对齐SIMD指令(比如movdqu而非movdqa)。
  • 两者二进制完全兼容,赋值操作仅会将_mm_set_epi64返回的128位数据原封不动写入目标地址,类型层面没有任何冲突。
额外注意事项
  • 你需要确保Var指向的内存空间至少有16字节可写容量,指针转换本身不存在越界问题。
  • 如果可以确认Var本身是16字节对齐的,直接使用__m128i类型性能更优,对齐SIMD读写的执行效率高于非对齐操作。
  • 该特性属于编译器扩展,仅MSVC下非对齐SIMD访问的语法略有区别,其余主流x86编译器都支持该用法。

内容的提问来源于stack exchange,提问作者vela18

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 09:06:03