【C++】——拷贝对象时编译器的一些优化
拷贝对象时编译器的一些优化
在有些拷贝对象的情况下,C++编译器会做一些优化,减少对象的拷贝,这个在有些场景下还是非常有用的。
那其实在上面我们已经提到过一种场景了:
我们说这种场景会发生一个隐式类型转换,先拿1去构造一个临时对象,然后再拷贝构造给对象a。 但是呢,编译器会进行一个优化,直接拿1去构造对象a。
那除此之外,在某些传参和传返回值的过程,也会有这样的优化。
来看这个类:
class A
{
public:
A(int a = 0)
:_a(a)
{
cout << "A(int a)" << endl;
}
A(const A& aa)
:_a(aa._a)
{
cout << "A(const A& aa)" << endl;
}
A& operator=(const A& aa)
{
cout << "A& operator=(const A& aa)" << endl;
if (this != &aa)
{
_a = aa._a;
}
return *this;
}
~A()
{
cout << "~A()" << endl;
}
private:
int _a;
};
看这个场景:
大家思考一下,在调用fun1传参的过程中,这里会发生优化吗? 我们来分析一下,这里正常的逻辑是先拿2去构造一个临时对象,然后再去拷贝构造形参a。 那这里肯定也是会直接优化成一步构造的。 我们可以来验证一下: 是不是只有一步构造啊,这里析构的其实是fun1中的a。 还有这种情况也是同样的道理。 当然这几种情况如果我们传的是引用的话那就不用拷贝了,所以传参能用引用的话可以尽量传引用。
再来看这种场景:
<font color = black>main函数里面只调用了一下fun2,在fun2函数里面,先是一个构造,然后是一个拷贝构造(因为a出函数就销毁了,返回的是一个临时变量,是a的拷贝,这个也是我们前面讲过的知识)。 那这里会优化吗? 不会的,因为这里的构造和拷贝构造并不是一个表达式里的,是分开的两步。当然不同的编译器也可能会不同处理。 我们可以调式观察一下:
那我们如果写成这样呢:
<font color = black>这里跟上面那样写相比是不是又多了一个拷贝构造啊。 返回值返回是一个拷贝构造,然后紧接着又把返回值拷贝构造给了aa。 那这里会优化吗? 是会的,因为这两个拷贝构造是不是一个连续的过程啊。 可以看到,这里跟上面是一样的。当然这是编译器优化的结果。
🆗,那如果我们接收返回值这样接收呢:
<font color = black> 我们先定义一个对象,然后拿定义好的对象去接收返回值。 这两种写法有什么不同呢,我们来对比一下: 大家可以看一下,差别还是挺大的。 第一种写法呢是构造(函数内)+一个拷贝构造(返回值),优化之后是这样;但是第二种的话是首先main函数内构造一个对象aa2,然后函数内一个构造,一个拷贝构造,最后又赋值给aa2。 所以说: 接收对象返回值的时候,尽量用拷贝构造的方式接收,不要赋值接收。
再来看,这样呢:
<font color = black>刚才我们是先构造一个对象,然后返回,那如果现在直接返回一个匿名对象呢? 那这样的话,匿名对象的构造和返回时的拷贝构造是不是就连续了,所以这里编译器就会对它进行优化了: 直接返回匿名对象的情况下,构造+拷贝构造就被优化成直接构造了。 所以在返回对象时,能用匿名对象的话可以选择用匿名对象。
7. 再次理解类和对象
现实生活中的实体 计算机并不认识,计算机只认识二进制格式的数据。如果想要让计算机认识现实生活中的实体,用户必须通过某种面向对象的语言,对实体进行描述,然后通过编写程序,创建对象后计算机才可以认识。
比如想要让计算机认识洗衣机,就需要:
用户先要对现实中洗衣机实体进行抽象——即在人为思想层面对洗衣机进行认识,洗衣机有什么属性,有那些功能,即对洗衣机进行抽象认知的一个过程
经过1之后,在人的头脑中已经对洗衣机有了一个清醒的认识,只不过此时计算机还不清楚,想要让计算机识别人想象中的洗衣机,就需要人通过某种面相对象的语言(比如:C++、Java、Python等)将洗衣机用类来进行描述,并输入到计算机中
经过2之后,在计算机中就有了一个洗衣机类,但是洗衣机类只是站在计算机的角度对洗衣机对象进行描述的,通过洗衣机类,可以实例化出一个个具体的洗衣机对象,此时计算机才能知道洗衣机是什么东西。
用户就可以借助计算机中洗衣机对象,来模拟现实中的洗衣机实体了。
在类和对象阶段,大家一定要体会到,类是对某一类实体(对象)来进行描述的,描述该对象具有哪些属性,哪些方法,描述完成后就形成了一种新的自定义类型,用然后用该自定义类型就可以实例化具体的对象。
🆗,那我们这篇文章的内容就到这里,欢迎大家指正!!!
- 点赞
- 收藏
- 关注作者
评论(0)