【发布时间】:2012-03-20 21:58:29
【问题描述】:
我知道返回std::move 通常不是一个好主意,即
bigObject foo() { bigObject result; /*...*/ return std::move(result); }
而不是简单
bigObject foo() { bigObject result; /*...*/ return result; }
因为它妨碍了返回值优化。但是对于具有多个不同返回的函数,特别是像
class bar {
bigObject fixed_ret;
bool use_fixed_ret;
void prepare_object(bigObject&);
public:
bigObject foo() {
if(use_fixed_ret)
return fixed_ret;
else{
bigObject result;
prepare_object(result);
return result;
}
}
};
我认为在这样的函数中不可能进行正常的返回值优化,所以放入是个好主意
return std::move(result);
在这里,或者我应该这样做(IMO 更丑,但这值得商榷)
bigObject foo() {
bigObject result;
if(use_fixed_ret)
result = fixed_ret;
else{
prepare_object(result);
}
return result;
}
【问题讨论】:
-
我无法参考标准,所以我不会做出答案,但我确信你不需要 std::move,我认为你混淆了 RVO 和复制省略,复制省略是有利于某些具有单个返回路径的编译器的优化。 BigObject 将成为其返回位置的 R 值。
-
是的,我认为复制省略是我一开始的意思。
-
另外,如果你喜欢干净的代码和代码级别的优化,你似乎喜欢,:),你可以在你的
foo()函数中去掉else{...分支。好像第一个语句为真,那么第二个语句不会被评估。 -
在您的示例中,您正在移动成员变量
fixed_ret。所以多次调用该函数可能不起作用。 -
@balki "移动你的成员变量
fixed_ret" 是吗?怎么样?
标签: c++ c++11 move-semantics return-value-optimization