SDS的定义
struct sdshrd
{
int len; //记录buf数组中已使用的字节数,等于SDS所保存的字符串长度
int free; //记录buf数组中未使用的字节数
char buf[];//字节数组,用于保存字符串
};
关于未使用空间,SDS是如何使用的?
sds采用了空间预分配和惰性空间释放两种策略模式来管理未使用空间
空间预分配
①如果对SDS进行修改后,SDS的长度(即len)的长度小于1 MB,那么程序将分配与len属性同样大小的未使用空间
②如果对SDS进行修改后,SDS的长度大于1MB,那么程序会分配1MB的未使用空间
惰性空间释放
惰性空间释放用于优化SDS的字符串缩短操作:当SDS的API需要缩短SDS所保存的字符串时,程序不立即使用内存重分配来回收缩短后多出来的字节,而是使用free属性将这些未使用的字节的数量记录起来,并等待将来使用。
相比C字符串,SDS的优点
①常数复杂度获取字符串长度
②杜绝缓冲区溢出
③减少修改字符串长度时所需的内存重分配次数
④二进制安全
⑤兼容部分C字符串函数