信任回报价值优化

时间:2010-01-25 11:31:39

标签: c++ variable-assignment return-value-optimization

如何使用返回值优化
有什么情况我可以信任现代编译器来使用优化,或者我应该总是以安全的方式返回某种类型的指针/使用引用作为参数吗?

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

3 个答案:

答案 0 :(得分:8)

每当启用编译器优化时(在大多数编译器中,即使优化禁用),也会发生RVO。 NRVO稍微不那么常见,但大多数编译器也会执行此优化,至少在启用优化时。

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

答案 1 :(得分:6)

答案 2 :(得分:2)

为了最大限度地发生它,你可以返回一个直接在return语句中构造的对象[任何人都能记住这个成语的名字 - 我已经忘记了它]:

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

但与所有优化一样,编译器总是可以选择不执行此操作。在一天结束时,如果你需要返回一个值,那么你就无法信任编译器 - 指针和引用不会削减它。