我们都知道
Foo returnAFoo()
{
return Foo();
}
将使用返回值优化进行编译,因此即使Foo
的复制构造函数具有副作用,也不会获取值副本。但是会
Foo returnAFoo()
{
Foo f = Foo();
return f;
}
太?调试时,第二个结构可能会有所帮助。但是我这样做会丢掉一个重要的优化吗?也许我需要编写一个显式的移动构造函数?
答案 0 :(得分:7)
没有。复制省略仍可在此处应用。在这种特定情况下,它被称为NRVO(命名返回值优化)。您不需要移动构造函数来执行复制省略;自从C ++ 98/03开始,我们只有复制构造函数时,copy elision一直在标准中。
为了最大化使用复制省略的机会,您应该确保:所有代码路径返回相同的对象(NRVO)或所有代码路径返回临时对象(RVO)。
如果在同一功能中混合使用NRVO和RVO,则很难应用优化。
Sample code展示了NRVO。