C++编译优化之RVO(Return Value Optimization) &&C++直接初始化与赋值初始化的区别

本文探讨了C++中的RVO(Return Value Optimization)优化和对象初始化的区别。通过实例分析,揭示了直接初始化与赋值初始化的执行过程,强调了构造函数隐式转换和`explicit`关键字的作用。同时,解释了RVO如何减少临时对象的生成,提高效率。
摘要由CSDN通过智能技术生成

C++编译优化之RVO(Return ValueOptimization)

C++直接初始化与赋值初始化的区别

        只要编程,问题就层出不穷,解决了一个,下回又会出新问题,好在有谷姐,度娘帮忙。这不今天编程时就遇到一个奇怪的问题,整整困扰了我一整天。闲话少说,让我们先来回顾一下。

 

一、  吐曹之事件

1.实例

        首先让我们看一段代码,起初以为是二义性引起的(结果肯定不是啰):

classB{

public:
       B(){std::cout<<"B()."<<std::endl;}
       explicit B(int*l){std::cout<<"B(int*l)."<<std::endl;}//explicit
       B&operator=(const B&)
       {
          std::cout<<"B&operator=(const B&)."<<std::endl;
       }
       B& operator=(B&)
       {
          std::cout<<"B&operator=(B&)."<<std::endl;
       }
      // B(constB&){std::cout<<"B(const B&)."<<std::endl;}
       B(B&){std::cout<<"B(B&)."<<std::endl;}

 };     

int  main()

{
    int *j;
    B w = j;
    B q = B(j);
    B l = w;
    return 0;
}
输出:
run.cpp: In function 'int main()':
run.cpp:46: error: no matching function for call to 'B::B(B)'
run.cpp:20: note: candidates are: B::B(B&)
run.cpp:15: note:                 B::B()
run.cpp:48: error: no matching function for call to 'B::B(B)'
run.cpp:20: note: candidates are: B::B(B&)
run.cpp:15: note:                 B::B()
        本以为是B(int*l), B(B&)造成了二义性,结果发现去掉B(const B&)注释就一切OK,煞是费解啊。

.二义性假设:

       1.B w = j;这条有两种执行方式:

            1)直接调用构造函数B(int*l)初始化w;

            2)j先调用B(int*l)生成临时对象,然后调用拷贝构造函数初始化w.

       2.由于B w = B(j);也报错,所以1中1)假设不成立。

 

         那么只有1中2)的假设是对的,即不是二义性引起的。那么就是拷贝构造函数的问题,这里需要声明B(j)这种调用方式产生的临时变量作为引用参数时都是常引用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值