交换操作的重要意义,以及它与赋值,拷贝的关系

不久之前,在阅读关于异常安全的内容时,看到一个赋值运算符的实现,与一般不同,是通过交换操作实现的,让我耳目一新,遂总结了下面的内容:

 

所谓赋值操作之类,实际就是对对象的生存管理,那么一般的,

对一个对象,只有创建和析构两种运算,析构无异常抛出,创建可能有异常
当涉及两个对象时,设对象AB。那么可以有赋值,拷贝,交换 共三种操作。

先说一下三者的语义:

拷贝:操作前A存在,B不存在,操作后B的内容与A相同。由于操作之前B不存在,无需考虑释放资源,效率比赋值要高。异常不安全

 

赋值,实际就是替换,replace。操作前 AB对象都已经存在,操作B=A,操作之后,A不变,B的内容变为A。由于需要产生一份A的资源副本给B,所以可能抛出异常。

 

交换:操作前AB都存在,操作后AB内容互换。由于交换操作只是将资源互换,所以原则上最环保零污染,而且可以异常安全。

交换操作是黄金圣斗士中的沙加,最接近于标准函数的函数。每次应该主动实现。

 

想重点讨论的是赋值,拷贝,交换这三个操作并不独立 ,其中两个可以构造出剩下的一个的语义:

1. 创建+赋值-->拷贝

这是显然的,创建B B=A 等效的就得到了A的拷贝。但是效率低下,更多的异常不安全,创建,赋值,两个操作都有可能抛出异常。

2. 拷贝+交换-->赋值

建临时对象BBA的拷贝, 交换AB (隐含操作,析构B
3.
拷贝+赋值-->交换

建临时对象temptempA的拷贝,

temp=A

A=B

B=temp

//over(隐含操作,析构temp

这实际上就是一般的swap实现方式。这种实现方式,首先,绝对不环保,超级浪费,其次,超级的异常不安全,每一步都是,ohmy god

综上所述,在实现赋值,拷贝,交换运算的时候,并不需要都单独实现。

 

我们可以只实现赋值运算, 拷贝运算可以由赋值运算和创建运算实现,交换可以由拷贝+赋值实现。以后如果需要修改也只要修改赋值运算符就可以了。评价:修改简单,但是效率低下,异常多多。

我们也可以实现赋值和拷贝运算,这是大多数时候的选择,交换操作可以通过拷贝和赋值形式上实现。以后只要修改赋值和拷贝运算。评价:在不涉及异常安全时,居家旅行必备首选。

我们也可以实现拷贝和交换运算, 赋值运算可以由拷贝+交换形式上予以实现。以后只要修改交换和拷贝运算。评价:异常出现点最少,在考虑异常安全时不二选择。实际代码实现也是比上面第二种要简单的。

 

最后用一句话总结一下:多关注交换操作,尤其是在多线程和异常安全环境下

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值