搜索
简帛阁>技术文章>谈谈C++中的swap函数

谈谈C++中的swap函数

1,最通用的模板交换函数模式:创建临时对象,调用对象的赋值操作符

 

需要构建临时对象,一个拷贝构造,两次赋值操作。

2,针对int型优化:

 

无需构造临时对象,异或

因为指针是int,所以基于这个思路可以优化1:

 

 

3,针对内建类型的优化:  int, flaot, double 等,甚至重载运算符的用户自定义类型:向量,矩阵,图像等。。。

type  a; -- e.g 10
type  b; -- e.g 5

a = a+b ; -- a=15,b=5
b = a-b ; -- a=15,b=10
a= a -b ; -- a= 5,b=10

// 无需构造临时变量。使用基本运算操作符。

 

4,swap的一些特化:

std::string, std::vector各自实现了swap函数,

string

 

第二个swap(Right)进行判断,如果使用了相同的分配器,则直接交换控制信息,否则调用string::operator=进行拷贝赋值。。。所以建议优先使用swap函数,而不是赋值操作符。

 

vector

vector的swap原理跟string完全一致,只有当当使用了不同分配器才进行字节拷贝。其余情况直接交换控制信息。

 

测试用例:

 

5,Copy and  Swap idiom

目的:C++异常有三个级别:基本,强,没有异常。通过创建临时对象然后交换,能够实现重载赋值操作符的强异常安全的执行。

Loki中智能指针 临时变量跟this交换,临时变量自动销毁~

 

boost::share_ptr,share_ptr定义了自己的swap函数。

 

记得本科上C++课,老师特别喜欢拿String来举例子,面试题也特别喜欢String。。。下面说说String::opreator=函数的优化:

最一般的写法,特点:使用const string& 传参防止临时对象。

 

优化1,防止自我间接赋值,a = b; c = b; a = c; 如果没有第一个if判断,当把c赋给a的时候,删除了a.itsString,后面的拷贝就会出错。注意是if(this==&rhs), 而不是if(*this==rhs) .

 

优化2,不进行拷贝赋值,只是交换控制信息,而且是强异常安全:

 

优化3,以最原始的传值方式传参,避免临时对象创建:

 

最后这张方式主要是对C++新特性rvalue的优化,具体参见:http://en.wikibooks.org/wiki/More_C++_Idioms/Copy-and-swap 

 6. vector clear and swap trick

vector.clear并只是将size变量置为0,并没有及时归还OS,STL仍然持有内存,以便后续push_back。实测如下

vector<int> temp;
此时打开资源管理器,内存如下:


增长vector然后清空:

temp.resize( 1024*1024*20 );    // 80M
temp.clear();
此时资源管理器内存:

clear以后进程兵没有及时将内存归还OS。。。通过swap方法:

 tmp.resize(1024*1024*20);	 // 80M
 // tmp.clear();
 {
      std::vector<int>().swap(tmp);        // 将内存归还OS
 }
退出作用域,临时对象销毁。内存归还OS。此时资源管理器中进程内存回到1,864K。


附上网络版的String:

 

 

参考引用:

1,http://www.vbforums.com/showthread.php?t=245517

2,http://www.cplusplus.com/reference/algorithm/swap/

3,http://codeguru.earthweb.com/forum/showthread.php?t=485643

4,http://stackoverflow.com/questions/1998744/benefits-of-a-swap-function

5,http://answers.google.com/answers/threadview/id/251027.html

 

C++ idioms

http://en.wikibooks.org/wiki/Category:More_C%2B%2B_Idioms

 

Copy and Swap idiom

http://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom


History:

20140401 - add 6 vector clear and swap trick!


1,最通用的模板交换函数模式:创建临时对象,调用对象的赋值操作符。templatevoidswap(T&a,T&b){Tc(a);ab;bc;}需要构建临时对象,一个拷贝构造,两次赋值操作。2,针对i
在学习C语言时,我们学到指针这里的时候,使用到Swap()函数,下面是关于Swap函数的一些见解。首先我们通常会用下面的代码来实现Swap函数整型变量的交换:voidSwap(int*p1,int*p
C++中的swap函数:交换函数好处:不用担心交换变量精度的缺失,无需构造临时变量,不会增加空间复杂度swap包含在命名空间std里面swap(a,b);(交换两个数)swap(a[i]b[j]);(
swap函数几乎是所有初学者都写过的一个最基本的函数之一,通常是用它来了解函数概念、形参与实参、引用和指针。然而,这个极为基础的函数却有着非常重要的作用。正因为它的重要性、普遍性,意味着swap函数
c语言中swap函数介绍(Introduction)Inthistutorial,wearegoingtolearntheswap()functioninC++programminglanguageS
本文是我用到swap函数时,对其产生好奇,所以结合网上有关博文写下的。个人水平有限,若有错误的地方,欢迎留言指出。谢谢!一、通用的函数交换模板1template<classT>2void
C语言四种swap函数/**实参传形参时,*形参临时复制实参的存储空间,*在临时分配的空间对a,b进行改变,*函数执行完成后,形参分配的空间自动释放,*最终,形参所做的任何变化对实参无影响,*a与b
这次我们要透过一个简单的函数swap深入理解函数传参的本质以及在C中如何选择传参方式。首先,先来看第一段程序:voidswap(intx,inty){<!>inttempy;yx;xte
SWAP的中文意思是交换,在Android系统中的意思即为交换分区。由于低端安卓手机配备的运行内存往往比较小,以中兴V880国行版为例,该机配备的运行内存只有256swap函数一般是一个程序员自定义函
接口的相关陈述1.一个接口定义了一个契约。2.接口可以包容方法、C属性、事件、以及索引器。3.在一个接口声明中,我们可以声明零个或者多个成员。4.所有接口成员的默认访问类型都是public。5.如果