首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这里不应用NRVO?

为什么这里不应用NRVO?
EN

Stack Overflow用户
提问于 2013-04-16 13:32:53
回答 2查看 1.5K关注 0票数 8

在VS2010中运行此代码时不应用NRVO。

代码语言:javascript
复制
#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。但是为什么呢?

EN

回答 2

Stack Overflow用户

发布于 2013-04-16 13:37:23

为什么这里不应用NRVO?

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

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

..。这种复制/移动操作的省略,称为复制省略,在以下情况下是允许的(可以合并以消除多个副本): -在具有类返回类型的函数中的返回语句中,当表达式是具有与函数返回类型相同的cv-非限定类型的非易失性自动对象(函数或CATC-子句参数除外)的名称时,可以通过将自动对象直接构造到该函数的返回值中来省略复制/移动操作。 ..。

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

是否应用NRVO完全取决于编译器。你不能指望它,也不能指望它不被执行。据我所知,这是所谓“如果”规则的唯一例外。

这就是说,当增加优化的级别时,执行NRVO的机会就会增加。

票数 6
EN

Stack Overflow用户

发布于 2013-04-16 13:38:11

我不知道你在你的环境中看到了什么,但这正如GCC所期望的那样(如请看这里):

法线:

代码语言:javascript
复制
I am in constructor
I am in constructor
I am in destructor
I am in destructor

-fno-elide-constructors**:**的

代码语言:javascript
复制
I am in constructor
I am in constructor
I am in copy constructor
I am in destructor
I am in destructor
I am in destructor
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16038511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档