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

含if语句的移动语义优化:return是否需用std::move?

关于多分支return中是否需要std::move的分析

先看你的代码:

std::vector<float> handle(const std::vector<float> &input, const std::size_t parameter){
    if (parameter == 1)
        return std::vector<float>(input);
    std::vector<float> temp(input.size() * parameter);
    for(std::size_t i = 0; i < temp.size(); ++i) {
        temp[i] = input[i / parameter];
    }
    return temp;
}

不管是第3行还是第8行的return语句,都不需要加std::move,原因如下:

  • 第3行返回的是临时对象std::vector<float>(input):编译器会触发返回值优化(RVO),直接把这个临时对象构造到函数返回的目标内存位置,完全跳过拷贝或移动步骤,效率最高。如果手动加std::move,会把临时对象转换成右值引用,反而破坏了RVO的触发条件,迫使编译器调用移动构造函数,多了一次不必要的操作。

  • 第8行返回的是局部变量temp:即使因为多分支return的存在,编译器可能无法触发命名返回值优化(NRVO),C++标准也规定,当返回自动存储期的局部对象时,编译器会自动将其视为右值,优先调用移动构造函数而非拷贝构造。如果手动加std::move,反而会阻止NRVO的可能(如果编译器本来能做优化的话),得不偿失。

总结:在这两个return分支里,加std::move不仅多余,还可能降低代码效率,完全没必要加。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 05:57:58