【发布时间】:2013-04-16 13:32:53
【问题描述】:
当我在 VS2010 中运行此代码时,未应用 NRVO。
#include <stdio.h>
class A
{
public:
A() { printf( "I am in constructor\n" ); }
A(const A& a) { printf( "I am in copy constructor\n" ); }
~A() { printf( "I am in destructor\n" ); }
int i;
};
A f(int j)
{
A a;
if ( j ) return a;
a.i = j;
return a;
}
int main()
{
A a;
a = f(5);
}
编辑:这与析构函数有关。当我注释掉它的行时,使用的是 NRVO。但这是为什么呢?
【问题讨论】:
-
您使用的是什么级别的优化?另请注意,如果只有一个返回值,则应用 NRVO 会简单得多,在这种情况下,这很简单,替换为
if:if (!j) a.i = j;则应用的机会会更高。 -
看这里,msdn.microsoft.com/en-us/library/ms364057%28v=vs.80%29.aspx NRVO 有限制。你确定,你启用了优化?
-
@DavidRodríguez-dribeas 我尝试了所有优化选项,结果都是一样的。
-
@user1042389:您的示例与 kassak 链接中的“示例 5”非常相似,其中优化失败,因为析构函数使控制流过于复杂,编译器无法分析。同样在那个链接中,它说“这实际上是 Visual C++ 2005 未来需要改进的东西”——也许他们在 2010 年之前没有做好这一改进。
-
@MikeSeymour 但它是阻止优化的析构函数。知道为什么会这样吗?
标签: c++ visual-studio-2010 nrvo