【发布时间】:2016-03-23 08:41:23
【问题描述】:
我们都知道
Foo returnAFoo()
{
return Foo();
}
将使用返回值优化进行编译,因此即使Foo 的复制构造函数有副作用,也不会进行值复制。但是会
Foo returnAFoo()
{
Foo f = Foo();
return f;
}
也是?第二个构造在调试时会很有帮助。但是我这样做是不是丢掉了一个重要的优化?也许我需要写一个显式的移动构造函数?
【问题讨论】:
-
请注意,返回值优化有一个特定的变体,称为 Named 返回值优化 (NRVO)。有时它比“普通”RVO 更难,但通常编译器可以做到。两者都与移动物体完全不同。如果您有显式复制构造函数/赋值运算符,那么您也需要显式定义移动构造函数/赋值运算符。
-
@BoBTFish:请把它作为答案:我会接受。
-
@P45 我不会费心(/有我真正应该做的工作)用例子、参考资料等来充实它。别担心,对某人来说不会花很长时间否则去做。 (不要觉得你必须接受一个不完整的答案,因为它是唯一的)。
-
@BoBTFish 复制省略在没有移动操作的情况下工作得很好。你能澄清一下吗?