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

C++中__m128等寄存器类型应按值还是按引用传递?

在C++中传递SIMD寄存器类型的最佳方式

在C++里传递__m128这类SIMD寄存器类型时,最佳方式是按值传递,原因如下:

  • 编译器优化特性:__m128是128位的SIMD类型,大小为16字节。现代编译器(如GCC、Clang、MSVC)处理这类类型时,会直接将它们放在对应的SIMD寄存器(如XMM寄存器)中传递,不会产生实际的内存复制操作,效率和传递基本类型完全一致。
  • 匹配内在函数的设计:Immintrin库中的所有内在函数都是按值接收参数的。如果用const __m128&传递,编译器为了满足引用的内存访问语义,可能会额外生成将数据从内存加载到寄存器的指令——哪怕实际数据本来就在寄存器里,这种冗余操作反而可能降低效率。
  • 语义清晰且避免麻烦:SIMD类型本质是值类型,和int、float这类基础类型的语义一致,传值更符合它们的使用逻辑。在多层抽象的场景中,传值不需要考虑引用的生命周期有效性,代码更简洁可靠。

对比你给出的两种写法:

// 推荐:按值传递
__m128 func(__m128 a, __m128 b) {
    return _mm_something(a, b);
}

// 不推荐:const引用传递
__m128 func(const __m128& a, const __m128& b) {
    return _mm_something(a, b);
}

实际编译时,传值版本的函数会直接从XMM寄存器读取参数调用内在函数;而引用版本在某些情况下会引入不必要的内存操作,哪怕编译器优化后可能消除,但传值的写法更稳定且符合惯例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 16:10:30