简单动态字符串

2020-11-11  本文已影响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语言字符串操作函数

上一篇 下一篇

猜你喜欢

热点阅读