Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

底层数据结构-sds

  • 简单动态字符串,最常用

  • 结构定义

    //N可取8、16、32、64
    sdshdrN {
        uintN_t len;
        uintN_t alloc;
        unsigned char flags;
        char buf[];
    }
    
    • 字段解释
      • len表示字符串长度
      • alloc表示未使用的剩余字节数
      • flags是8位二进制,低3位表示头部类型,高5位未使用
      • buf保存字符串的每个元素
  • 好处

    • 1、记录了长度

      • 获取长度时,直接拿而不用遍历数
      • 拼接字符串时,可先算出最终长度,判断分配空间够不够
    • 2、避免了修改时多次分配内存

      • 空间预分配:每一次追加字符时,都会多分配一倍的追加后长度,等下次追加就不用重新分配,这个一倍最多是1M
      • 惰性空间释放:每一次缩短字符串,都不立即回收内存,而是记录在alloc属性中,等待后续使用(当然也有API可以主动去释放)
    • 3、二进制安全

      • 不是用C语言的\0作为结尾,而是用长度判断结尾,因此可以存储二进制数据,比如图片也可以存