为什么visualc++;没有对最简单的代码执行返回值优化? Visual C++不执行返回值优化吗?< /P> #include <cstdio> struct Foo { ~Foo() { printf("Destructing...\n"); } }; Foo foo() { return Foo(); } int main() { foo(); }

为什么visualc++;没有对最简单的代码执行返回值优化? Visual C++不执行返回值优化吗?< /P> #include <cstdio> struct Foo { ~Foo() { printf("Destructing...\n"); } }; Foo foo() { return Foo(); } int main() { foo(); },c++,visual-c++,return-value-optimization,C++,Visual C++,Return Value Optimization,它会打印: 破坏… 破坏 为什么它不执行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()

它会打印:

破坏…
破坏

为什么它不执行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(); }

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

你可能想问微软,而不是StackOverflow…@DavidRodríguez dribeas:他们说可以执行命名RVO(这要困难得多),但我既不能让NRVO工作,也不能让简单的RVO工作。所以我觉得我在这里做错了什么,因为如果他们不支持,他们就不会提到它(希望…@Mehrdad:你有微软的文档链接吗?我收回了我的评论,因为我有一个不正确的假设(我认为可能会出现移动构造而不是RVO,但事实并非如此)。如果这个问题对您很重要,我建议在上打开一个bug。因为这个问题似乎只影响没有非平凡构造函数的类类型,所以我不确定这是否是一个大问题(既然RVO是一个可选的优化,它不是一个一致性问题),但它仍然值得报告。@JamesMcNellis:噢,太棒了,谢谢!嗯……你介意解释一下是什么导致了这段代码和我的代码之间的差异吗?@Mehrdad:不知怎的,编译器生成的默认构造函数似乎抑制了[N]RVO.一旦您添加了自己的默认构造函数,就可以使用[N]RVO(例如,如果您添加并调用:
foobar(){Foo f;return f;}
,您只需再获得一个析构函数invaction,因此NRVO也可以使用)。构造函数不一定需要用户声明:使
Foo
具有非平凡的默认或复制构造函数也将“可重新启用”RVO(例如,为其提供类型为
std::string
的数据成员)@JamesMcNellis::O你从哪里学来的?!我以前从未见过这些信息……底线是:编译器只会在复制成本高到值得消除的情况下才费心消除复制。
#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...