关于STL中string的拷贝问题

简介

在不同版本的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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值