Copy-and-swap
为了在自己定义类里重载一个异常安全(exception safe)的赋值操作符。创造了一个这种习惯用语。也叫:Create-Temporary-and-Swap。
要想写健壮的C++代码。异常安全很重要。
能够给异常安全分三级:
1> 基本安全:实现简单、代价小。应该作为常规手段。
2> 非常安全:在不论什么场合都实现这一步不太可能。本例的赋值操作符重载算是一个。
3> 不抛出异常:能够看non-throwing swap。
所谓“Create-Temporary-and-Swap”。就是先申请新资源。用后再释放。
1> 在申请新资源的时候,要使用RAII原则。
2> 申请成功之后。使用non-throwing swap原则交换资源。
- class String {
- char * str;
- public:
- String& operator = (String const &s)
- {
- String temp (s); // copy-constructor -- RAII
- temp.swap (*this); // non-throwing swap
- return *this;
- }
- void swap (String &s) throw ()
- {
- std::swap(this->str, s.str);
- }
- };
有时会增加对參数的推断:
- class String {
- char * str;
- public:
- String& operator = (String const &s)
- {
- if (this != &s)
- String(s).swap (*this); // copy-constructor and non-throwing swap
- return *this;
- }
- void swap (String &s) throw ()
- {
- std::swap(this->str, s.str);
- }
- };
在函数内部的暂时变量。事实上能够省略。仅仅要用传值的方式:
- String& operator = (String s) // pass-by-value
- {
- s.swap (*this); // Non-throwing swap
- return *this;
- }
这样的作法在某些情况下能够得到优化。
假设s绑定到lvalue,无优化。栈内会有暂时对象被创建;假设绑定到rvalue。一般就会省略掉copy ctor的调用。
- String createString(); // a function that returns a String object.
- String s;
- s = createString(); // 这是rvalue的一例。使用传值的赋值操作符。可得到优化
在C++0x标准中,这种赋值操作符叫做“统一赋值操作符”,由于它合“拷贝赋值”、“移动赋值”为一体了。C++0x编译器一旦发现某个类有move ctor存在,总会对暂时的rvalue进行优化的。
老编译器当然没有move ctor,可是能对赋值操作进行rvalue的优化,也算是有的一比。
Copy-and-swap的更多相关文章
- c++异常安全和copy and swap策略
异常安全有两个目标: 不泄露任何资源.这个通过RAII可以做到. 不破坏数据结构.这是下文要讨论的事情 异常安全有三个级别: 基本安全:异常发生后对象和数据结构还有合法状态.实现简单,应该作为最低要求 ...
- C++异常安全、copy and swap
异常安全的代码是指,满足两个条件 1异常中立性 : 是指当你的代码(包括你调用的代码)引发异常时,这个异常 能保持原样传递到外层调用代码.(异常中立,就是指任何底层的异常都会抛出到上层,也就相当于是异 ...
- copy and swap技巧与移动赋值操作符
最近在实现一个Delegate类的时候碰到了一个问题,就是copy and swap技巧和移动赋值操作符有冲突. 比如有以下一个类: class Fun { public: Fun(const Fun ...
- 做个地道的c++程序猿:copy and swap惯用法
如果你对外语感兴趣,那肯定听过"idiom"这个词.牛津词典对于它的解释叫惯用语,再精简一些可以叫"成语".想要掌握一门语言,其中的"成语" ...
- c++ swap 函数
转载地址 1,最通用的模板交换函数模式:创建临时对象,调用对象的赋值操作符. template <class T> void swap ( T& a, T& b ) { T ...
- [转]谈谈C++中的swap函数
1,最通用的模板交换函数模式:创建临时对象,调用对象的赋值操作符. template <class T> void swap ( T& a, T& b ) { T c(a) ...
- [020]转--C++ swap函数
原文来自:http://www.cnblogs.com/xloogson/p/3360847.html 1.C++最通用的模板交换函数模式:创建临时对象,调用对象的赋值操作符 template < ...
- 【转】 谈谈C++中的swap函数
1,最通用的模板交换函数模式:创建临时对象,调用对象的赋值操作符. template <class T> void swap ( T& a, T& b ) { T c(a) ...
- 【C++ 补习】Copy Control
C++ Primer 5th edition, chapter 13. The Rule of Three If a class needs a destructor, it almost surel ...
- swap function & copy-and-swap idiom
在C++中,众所周知在一个资源管理类(例如含有指向堆内存的指针)中需要重新定义拷贝构造函数.赋值运算符以及析构函数(Big Three),在新标准下还可能需要定义移动构造函数和移动赋值运算符(Big ...
随机推荐
- How to write simple HTTP proxy with Boost.Asio
How to write simple HTTP proxy with Boost.Asio How to write simple HTTP proxy with Boost.Asio Russia ...
- LAN路由
一.实验的目的: 实现不同子网之前的信息交流 二.如果 1.虚拟子网 VMnet8:192.168.233.0/24 VMnet1:172.16.1.0/24 2.虚拟机vm1 ip:1 ...
- nginx源代码分析--高性能server开发 常见的流程模型
1.高性能server 对于高性能server对于.处理速度和占用空间小是典型特性.特别是当server经验C10K问题的时候(网络server在处理数以万计的client连接时.往往出现效率低下甚至 ...
- OCA读书笔记(14) - 备份和恢复基本概念
备份恢复概念 如何判断数据库的一致性 在mount状态下,oracle如何判断数据库的一致性 scn:system change number,它是数据库时钟 如何查询当前系统的scn: select ...
- hdu 1086(判断线段相交)
传送门:You can Solve a Geometry Problem too 题意:给n条线段,判断相交的点数. 分析:判断线段相交模板题,快速排斥实验原理就是每条线段代表的向量和该线段的一个端点 ...
- Spring中继承配置的注入方法
(1)两个java类.一个父类一个字类 package com.lc.inherit; /* * 这里是父类 */ public class Student { protected String na ...
- Ubuntu14.04搭建android开发环境
一 下载ADT 官方下载地址:http://developer.android.com/sdk/index.html(须要FQ或者改动host) 二 解压 1 使用终端将下载的文件解压当前文件夹下: ...
- CacheHelper工具类的使用
package com.bbcmart.util; import net.sf.ehcache.Cache; import net.sf.ehcache.CacheManager; import ne ...
- A Game of Thrones(15) - Sansa
Eddard Stark had left before dawn, Septa Mordane informed Sansa as they broke their fast. “The king ...
- Linux 系统文件夹结构
登录后,在当前的命令窗口中输入命令: <span style="font-size:14px;">ls /</span> 你的终端上会出现例如以下的代码: ...