Visual C++是否不执行返回值优化?
#include <cstdio>
struct Foo { ~Foo() { printf("Destructing...\n"); } };
Foo foo() { return Foo(); }
int main() { foo(); }
我编译并运行它:
cl /O2 test.cpp
test.exe
结果输出:
析构中...
析构中...
为什么没有进行返回值优化(RVO)呢?
Visual C++是否不执行返回值优化?
#include <cstdio>
struct Foo { ~Foo() { printf("Destructing...\n"); } };
Foo foo() { return Foo(); }
int main() { foo(); }
我编译并运行它:
cl /O2 test.cpp
test.exe
结果输出:
析构中...
析构中...
为什么没有进行返回值优化(RVO)呢?
当我使用这个进行测试:
#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(); }
我得到的输出是:
Destructing...
没有调用复制构造函数,只有一个析构函数被调用。
Foo bar() { Foo f; return f; }
,您只需多一个析构函数调用,所以NRVO也将起作用)。 - Jerry CoffinFoo
具有非平凡的默认构造函数或复制构造函数也可以“重新启用”RVO(例如,给它一个类型为std::string
的数据成员)。 - James McNellis