string类的实现

  • string类实现的演变

  • eager-copy(深拷贝)

  • cow-copy(写时复制)

  • sos(短字符串优化)

  • 最佳策略
    以上三种方式,都不能解决所有可能遇到的字符串的情况,各有所长,又各有缺陷。综合考虑所有情况之后,facebook开源的folly库中,实现了一个fbstring, 它根据字符串的不同长度使用不同的拷贝策略, 最终每个fbstring对象占据的空间大小都是24字节。

1. 很短的(0~22)字符串用SOs,23字节表示字符串(包括'\0'),1字节表示长度
2. 中等长度的(23~255)字符串用eager copy,8字节字符串指针,8字节size,8字节capacity.
3. 很长的(大于255)字符串用COW, 8字节指针(字符串和引用计数),8字节size,8字节capacity.
  • 线程安全
    两个线程同时对同一个字符串进行操作的话, 是不可能线程安全的, 出于性能考虑, C++并没有为string实现线程安全, 毕竟不是所有程序都要用到多线程。
    但是两个线程同时对独立的两个string操作时, 必须是安全的. COW技术实现这一点是通过原子的对引用计数进行+1或-1操作。
    CPU的原子操作虽然比mutex锁好多了, 但是仍然会带来性能损失, 原因如下:
1. 阻止了CPU的乱性执行.
2. 两个CPU对同一个地址进行原子操作, 会导致cache失效, 从而重新从内存中读数据.
3. 系统通常会lock住比目标地址更大的一片区域,影响逻辑上不相关的地址访问
posted @   从今天学到明天  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
点击右上角即可分享
微信分享提示