当我在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。但是为什么呢?

最佳答案



如果这纯粹是您的好奇心,并且您想知道VC10如何通过算法决定是否执行NRVO,那么唯一能够可靠地回答此问题的人就是那些知道VC10内部工作原理的人-那些是编写它的人。

据我所知,在这种情况下,根据C++ 11标准,允许编译器执行来执行NRVO,而并非这样做只是编译器的决定-并非由于任何有效性约束。根据第12.8/31段:



但是,如果您期望能够强制编译器执行NRVO,则答案是“您不能”。

是否应用NRVO完全由编译器决定。您不能指望它,也不能指望它没有被执行。据我所知,这是所谓的“假设”规则的唯一异常(exception)。

也就是说,随着增加优化的水平,执行NRVO的机会也会增加。

关于c++ - 为什么未在此处应用NRVO?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16038511/

10-08 23:18