定义
// sds.h
struct sdshdr
{
unsigned int len;
unsigned int free;
char buf[];
}
内存布局
![](https://img.haomeiwen.com/i4894375/c24449c8c1816747.jpg)
优势
- 常数复杂度获取字符串长度
// 从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;
}
- 内存预分配和惰性释放
避免在字符串操作过程中,连续多次申请内存。
内存分配策略
// 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;
}
-
自定义字符串操作函数
避免在字符串操作过程中,内存溢出 -
兼容部分C语言字符串操作函数
网友评论