美文网首页
简单动态字符串

简单动态字符串

作者: 左后卫 | 来源:发表于2020-11-11 19:23 被阅读0次

    定义

    // sds.h
    struct sdshdr
    {
      unsigned int len;
      unsigned int free;
      char buf[];
    }
    

    内存布局

    redis_sdshdr.jpg

    优势

    1. 常数复杂度获取字符串长度
    // 从len字段直接获取长度值
    // sds.h
    typedef char* sds;
    static inline size_t sdslen(const sds s)
    {
      struct sdshdr *sh = (void*)(s - sizeof(struct sdshdr));
      return sh->len;
    }
    
    1. 内存预分配和惰性释放
      避免在字符串操作过程中,连续多次申请内存。
      内存分配策略
    // sds.h sds.c
    #define SDS_MAX_PREALLOC (1024*1024)
    sds sdsMakeRoomFor(sds s, size_t addlen)
    {
      struct sdshdr *sh, *newsh;
      size_t free = sdsavail(s);
      size_t len, newlen;
      if (free >= addlen)
      {
        return s;
      }
      len = sdslen(s);
      sh = (void*) (s - (sizeof(struct sdshdr)));
      newlen = (len + addlen);
      if (newlen < SDS_MAX_PREALLOC)
      {
        newlen *= 2; // 小于1M时,free == len
      }
      else
      {
        newlen += SDS_MAX_PREALLOC; // 大于1M时,free == 1M
      }
      newsh = zrealloc(sh, sizeof(struct sdshdr) + newlen + 1);
      if (newsh == NULL)
      {
        return NULL;
      }
      newsh->free = newlen - len;
      return newsh->buf;
    }
    
    1. 自定义字符串操作函数
      避免在字符串操作过程中,内存溢出

    2. 兼容部分C语言字符串操作函数

    相关文章

      网友评论

          本文标题:简单动态字符串

          本文链接:https://www.haomeiwen.com/subject/ugkybktx.html