引入新变量是否会破坏 return 值优化?
Does introducing a new variable defeat return value optimisation?
我们都知道
Foo returnAFoo()
{
return Foo();
}
将使用 return 值优化进行编译,因此即使 Foo
的复制构造函数有副作用,也不会进行值复制。但是会
Foo returnAFoo()
{
Foo f = Foo();
return f;
}
也是吗?第二个构造在调试时很有用。但是我这样做是不是放弃了一个重要的优化?也许我需要写一个明确的移动构造函数?
没有。复制省略仍然可以在这里应用。在这种特定情况下,它称为 NRVO(名为 return 值优化)。您不需要移动构造函数来执行复制省略;自 C++98/03 以来,复制省略一直是标准,当时我们只有复制构造函数。
为了最大限度地提高使用复制省略的机会,您应该确保:所有代码路径 return 同一对象 (NRVO) 或所有代码路径 return 一个临时对象 (RVO ).
如果您在同一函数内混合搭配 NRVO 和 RVO,则很难应用优化。
Sample code 演示 NRVO。
我们都知道
Foo returnAFoo()
{
return Foo();
}
将使用 return 值优化进行编译,因此即使 Foo
的复制构造函数有副作用,也不会进行值复制。但是会
Foo returnAFoo()
{
Foo f = Foo();
return f;
}
也是吗?第二个构造在调试时很有用。但是我这样做是不是放弃了一个重要的优化?也许我需要写一个明确的移动构造函数?
没有。复制省略仍然可以在这里应用。在这种特定情况下,它称为 NRVO(名为 return 值优化)。您不需要移动构造函数来执行复制省略;自 C++98/03 以来,复制省略一直是标准,当时我们只有复制构造函数。
为了最大限度地提高使用复制省略的机会,您应该确保:所有代码路径 return 同一对象 (NRVO) 或所有代码路径 return 一个临时对象 (RVO ).
如果您在同一函数内混合搭配 NRVO 和 RVO,则很难应用优化。
Sample code 演示 NRVO。