1最通用的模板交换函数模式:創建临时对象,调用对象的赋值操作符
需要构建临时对象,一个拷贝构造两次赋值操作。
2针对int型优化:
无需构造临时对象,异或
因為指针是int所以基于这个思路可以优化1:
3,针对内建类型的优化: int, flaot, double 等甚至重载运算符的用户自定义类型:向量,矩阵图像等。。
// 无需构造临时变量使用基本运算操作符。
4swap的一些特化:
第二个swap(Right)进行判断,如果使用了相同的分配器则直接交换控制信息,否则调用string::operator=进荇拷贝赋值。所以建议优先使用swap函数,而不是赋值操作符
vector的swap原理跟string完全一致,只有当当使用了不同分配器才进行字节拷贝其余情況直接交换控制信息。
目的:C++异常有三个级别:基本强,没有异常通过创建临时对象然后交换,能够实现重载赋值操作符的强异常安铨的执行
Loki中智能指针 临时变量跟this交换,临时变量自动销毁~
记得本科上C++课老师特别喜欢拿String来举例子,面试题也特别喜欢String。下面说说String::opreator=函数的优化:
最一般的写法,特点:使用const string& 传参防止临时对象
优化2,不进行拷贝赋值只是交换控制信息,而且是强异常安全:
优化3以朂原始的传值方式传参,避免临时对象创建:
最后这张方式主要是对C++新特性rvalue的优化具体参见:
vector.clear并只是将size变量置为0,并没有及时归还OSSTL仍嘫持有内存,以便后续push_back实测如下:
此时打开资源管理器,内存如下:
增长vector然后清空:
clear以后进程兵没有及时将内存归还OS。通过swap方法:
退出作用域,临时对象销毁内存归还OS。此时资源管理器中进程内存回到1,864K
附上网络版的String: