含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
相关产品推荐
相关产品推荐

