返回值优化

对于代码:

class B{
    
public:
    int data;
    B(){
        data = 0;
        id = s_i++;
        cout<<"construct "<<id <<endl;
    }
    B(const B &b){
        data = b.data;
        id = s_i++;
        cout<<"copy construct "<<id<<endl;
    }
    B(int i):data(i){
        id = s_i++;
        cout<<"parameter construct "<<id<<endl;
    }
    ~B() {
        cout<<"destruct"<< " " <<id<<endl;
    }
    static int s_i;
    int id;
    
};

int B::s_i = 0;

B play(B& b) {
    b.data = 2;
    return b;
}

B creat() {
    B b(3);
    return b;
   // return B(3);
}

int main() 
{
 /*  B b1(1);
   B b = play(b1);
   cout<<b.data<<endl;*/

    B b = creat();
   return 0;

}

按照书上的说法是,先创建局部变量b,然后调用拷贝构造函数将b赋值给临时变量t,函数返回调用b的析构函数, 然后t调用拷贝构造函数赋值给main函数中的b,然后t析构,最后main中的b析构。

但是编译器会进行优化,编译器“偷偷地”在我们写的creat函数中增加一个参数 B&,然后把 b 的地址传进去(注意,这个时候 b 的内存空间已经存在了,但对象还没有被“构造”,也就是构造函数还没有被调用),然后在函数体内部,直接用 b 来代替原来的“临时对象”,在函数体内部就完成 b 的构造


还可以继续优化,

B creat() {
   return B(3);
}

这将直接构造main中的对象b



有空要好好研究下 http://www.cnblogs.com/liyiwen/archive/2009/12/02/1615711.html





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值