能否将返回__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
相关产品推荐
相关产品推荐

