关于STL中string的拷贝问题

来源:互联网 发布:手机淘宝上买东西教程 编辑:程序博客网 时间:2024/06/05 19:39

简介

在不同版本的STL中string类实现拷贝的方式也是不一样的。大致分为三种方式
eager copy(贪婪拷贝):这种情况是最简单粗暴的拷贝方式,也就是每个对象都是相互独立的,每次拷贝都是深拷贝。这种拷贝方式的缺点就是浪费空间,但是保证了每个对象的独立互不干扰。

SSO(small string optimization,小字符串直接放在对象的栈空间中):这种拷贝方式对小字符串的处理很高效,一般是小于20个字节。

COW(copy on write,写时拷贝):这种拷贝方式使用引用计数,当一个对象被拷贝多份时,往往在内存空间中只有一个对象实体,对象中有一个引用计数记录有多少对象指针指向这个实体,只有在某个对象指针要对对象进行修改时才会真正拷贝一份,所以就叫做写时拷贝。很多地方都用到了写实拷贝技术,linux创建子进程使用fork函数时,此时子进程和父进程就用到了写时拷贝。

注意

写时拷贝带来的问题:COW的确是一种非常节省空间的拷贝方式,但是同时会带来一些问题,因为COW使用了共享的对象,那么必然就会牵扯到多线程下的线程安全问题,显然COW的string不是线程安全的,如果要实现线程安全就要保证同步,例如对引用计数加锁实现同步,那么这必然会造成性能上的损失,同步也有悖于C++的设计哲学:不要关心你不使用的东西。(这句话装逼专用)

改进

所以现在很多STL的string同时使用了这三种不同的拷贝方式来处理不同的情况,从而达到性能最优:短字符串SSO,中等长度字符串eager copy,长字符串COW。