C++编译器对临时对象的优化

思考:我们在构造运算符重载+号重载的时候会构造那些函数呐???

例子:小dome

 //该运算重载函数 由 左操作数调用,右操作数当做实参传递给该函数
    //触发t1+t3->t1.operator +(t3)
    Test operator +(const Test &t)
    {
        cout << "Test operator +(Test &t)" <<endl;
        Test val;//保存最后的执行结果
        val.data = this->data + t.data;
        val.ptr = new char [strlen(this->ptr) + strlen(t.ptr) + 1];
        //将分配的堆空间初始化为0
        memset(val.ptr,0,strlen(this->ptr)+strlen(t.ptr)+1);

        strcat(val.ptr,this->ptr);
        strcat(val.ptr,t.ptr);

        return val;
    }



eg:

main
{
    Test t4 = t1 + t3;
}

当调用重载函数返回了val 对象,但是随着该函数的调用结束对象val会被系统回收了,因为对象val在函数的栈上

那是如何保存值的呐????????????

这是是通过拷贝,在内存上有一块空间暂存拷贝过来的val对象,这个时候就会触发拷贝构造函数的调用,然后我们在main函数中由触发了一次拷贝构造函数

所以总共进行了两次拷贝构造函数

但是打印出来的拷贝构造函数一次都没有

  //拷贝构造函数
    Test(const Test & t)
    {
        cout << "Test(const Test & t)" << endl;
        //实现深拷贝
        this->data=t.data;
//        this->ptr = t.ptr;//浅拷贝
        if(strlen(t.ptr))
        {
            this->ptr = new char[strlen(t.ptr)+1];
            strcpy(this->ptr,t.ptr);
        }
        else
            ptr= new char[10];
    }

这是因为编译器对其进行了优化,提高了效率,想要查看的话(以Clion为例)打开Terminal模式

输入:g++ main.cpp -o main -fno-elide-constructors

输入:dirc,查看目录

此时产生了一个新的文件叫做main.exe

执行main.exe

可以看到显示调用了一次运算符重载函数

后边产生了两次构造函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值