为什么Visual C++没有对最简单的代码执行返回值优化?

Meh*_*dad 13 c++ visual-c++ return-value-optimization

Visual C++不执行返回值优化吗?

#include <cstdio>
struct Foo { ~Foo() { printf("Destructing...\n"); } };
Foo foo() { return Foo(); }
int main() { foo(); }
Run Code Online (Sandbox Code Playgroud)

我编译并运行它:

cl /O2 test.cpp
test.exe
Run Code Online (Sandbox Code Playgroud)

它打印:

破坏...
破坏......

为什么不执行RVO?

Jer*_*fin 15

当我测试时:

#include <iostream>
struct Foo { 
    Foo(Foo const &r) { std::cout << "Copying...\n"; }
    ~Foo() { std::cout << "Destructing...\n"; }
    Foo() {}
};

Foo foo() { return Foo(); }

int main() { Foo f = foo(); }
Run Code Online (Sandbox Code Playgroud)

...我得到的输出是:

Destructing...
Run Code Online (Sandbox Code Playgroud)

没有复制构造函数的调用,只有一个析构函数.

  • 一句话:当至少有一些可能的复制价格足以值得消除时,编译器只会为消除副本而烦恼. (7认同)
  • @Mehrdad:不知何故,编译器生成的默认构造函数似乎禁止[N] RVO.一旦你添加了你自己的默认ctor,你就会工作[N] RVO(例如,如果你添加并调用:`Foo bar(){Foo f; return f;}`,你只需再获得一个析构函数,所以NRVO也可以.) (6认同)
  • 构造函数不一定需要是用户声明的:导致`Foo`具有非平凡的默认值或复制构造函数也将"重新启用"RVO(例如,给它一个类型为`std :: string`的数据成员). (6认同)