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 @ 2023-06-25 16:23  从今天学到明天  阅读(38)  评论(0)    收藏  举报