【问题标题】:the obj should have been destroyed at the end of function call 'f' [duplicate]obj应该在函数调用'f'结束时被销毁[重复]
【发布时间】:2014-07-12 16:54:30
【问题描述】:

obj应该在函数调用'f'结束时被销毁,返回的对象应该是一个新对象。我应该收到两次“Destroying”消息。

#include <iostream>
using namespace std;

class c{
    int i;
public:
    ~c(){cout<<"Destroying"<<endl;}
    c(){cout<<"Constructing"<<endl;}
    c(const c &a){cout<<"Copy Constructing"<<endl;}
    int get_i(){cout<<i<<endl;return i;}
    void set_i(int i){this->i=i;}
};

c f(){
    c obj;
    obj.set_i(1);
    return obj;
}
int main() {
    f().get_i();
    return 0;
}

【问题讨论】:

  • 我在发布模式下得到 1 个“Destroying”打印输出,在调试模式下得到 2 个“Destroying”打印输出。

标签: c++


【解决方案1】:

这称为返回值优化 (NRVO)。删除不必要的对象副本是一种优化。对象obj是在函数的返回值中直接构造的。

在少数情况下明确允许删除副本,包括:

在具有类返回类型的函数的 return 语句中,当表达式是与函数具有相同 cv 非限定类型的非易失性自动对象(函数或 catch 子句参数除外)的名称时返回类型,直接在函数的返回值中构造自动对象即可省略复制/移动操作

【讨论】:

    猜你喜欢
    • 2015-04-12
    • 1970-01-01
    • 2015-10-28
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    • 2021-11-25
    相关资源
    最近更新 更多