6

您如何使用返回值优化
在任何情况下,我可以信任现代编译器来使用优化,还是应该始终以安全的方式返回某种类型的指针/使用引用作为参数?

是否存在无法进行返回值优化的已知情况?在我看来,编译器执行返回值优化相当容易。

4

3 回答 3

8

无论何时启用编译器优化(在大多数编译器中,即使优化被禁用),RVO 都会发生。NRVO 不太常见,但大多数编译器也会执行此优化,至少在启用优化时是这样。

你是对的,编译器执行优化相当容易,这就是编译器几乎总是这样做的原因。唯一“无法进行”的情况是优化不适用的情况:RVO 仅在您返回未命名的临时文件时适用。如果你想返回一个命名的局部变量,则应用 NRVO,虽然编译器实现起来稍微复杂一些,但它是可行的,现代编译器对此没有任何问题。

于 2010-01-25T11:36:19.930 回答
6

请参阅:http ://en.wikipedia.org/wiki/Return_value_optimization#Compiler_support

于 2010-01-25T11:33:39.900 回答
2

为了让它发生的最好机会,你可以返回一个直接在 return 语句中构造的对象[任何人都记得这个成语的名字 - 我忘记了]:

Foo f() {
    ....
    return Foo( ... );
}

但与所有优化一样,编译器总是可以选择不这样做。归根结底,如果您需要返回一个值,那么除了信任编译器之外,您别无选择 - 指针和引用不会削减它。

于 2010-01-25T11:36:18.870 回答