关于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。
阅读全文
0 0
- 关于STL中string的拷贝问题
- C++之stl::string写时拷贝导致的问题
- STL——STL中string的写时拷贝机制
- string.h 中 关于数据拷贝的几个函数测试
- stl中push_back和浅拷贝和深拷贝的问题
- String类的拷贝问题
- stl 中string类的构造函数是否是深拷贝?
- stl中string作为成员变量引起的core问题
- stl中string作为成员变量引起的core问题
- stl string的COW问题
- 关于Dll中导出string的问题
- 关于java中string.length()的问题
- php中关于string编码的问题
- 关于String类的写实拷贝
- ActionScript3中关于数组深浅拷贝的问题
- 关于HashMap的拷贝问题
- 关于CString的拷贝问题
- Map拷贝 关于对象深拷贝 浅拷贝的问题
- system verilog中不可不小心的陷阱
- JS判断设备-检查手机系统-检测系统
- JS-手机长按点击事件
- JS首字母大写-每个单词首字母大写
- JS网址编码解码
- 关于STL中string的拷贝问题
- pageX- clientX- screenX-区别
- Trasform属性学习-Css3
- 欢迎使用CSDN-markdown编辑器
- select,poll,epoll函数
- 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛C. Coconut
- [计算机组成原理]--字节进制与补码介绍
- 《第一行代码》RecyclerView学习笔记
- 基于UDP协议可靠传输协议QUIC协议和golang server代码和client代码