简单动态字符串
sds的定义
- 数据结构
struct sdshdr {
int len;
int free;
char buf[];
};
-
属性介绍
- len
- free
- buf
len:保存字符串长度 free:数组中未使用字符串的数量 buf:字节数组保存字符串
sds 与 c字符串区别
- 常数复杂度获取字符串长度,因为sds纪录了字符串的长度
- 杜绝缓冲区溢出,sds记录了字符串长度,使用空间分配策略杜绝了缓冲区溢出
- 减少修改字符串时候带来的内存重分配,空间分配策略使用了预分配和惰性空间释放
- 二进制安全,可以保存图片音频等二进制数据,不是空字符串表示字符串是否已经结束
- 兼容部分c字符串,这样可以重用string.sh库定义函数
内存分配策略
- 内存预分配
小于1m分配len属性和free属性相同的空间,len*2+1 额外1字节用于保存空字符串 大于1m分配free1m空间,len+1m+1,额外1字节用于保存空字符串
- 惰性空间释放 缩短时候放入free未使用空间中,方便后续增长操作,不需要时候可以调用删除api释放未使用空间