每个sds.h/sdshdr 结构表示一个SDS值
struct sdshdr {
//记录 buf 数组中已经使用的字节数量
//等于SDS所保存字符串的长度
int len;
//记录buf数组中未使用字节的数量
int free;
//字节数组,用于保存字符串
char buf[];
};
图2-1 展示了一个SDS 示例:
1、free 属性值为0,表示这个SDS没有继续分配可使用的空间了。
2、len属性的值为5,表示这个SDS已经保存了一个5字节的字符串。
3、buf属性 是一个char类型的数组,数组的前5个字节分别保存了
‘R’、‘e’、‘d’、‘i’、‘s’五个字符,而最后一个字节则保存了空字符’\0’。
SDS遵循C字符串以空字符结尾的惯例,保存在空字符的1字节空间不计算在SDS的len属性里面,并且为空字符分配额外的1字节空间,以及添加空字符到字符串末尾的操作都是由SDS函数自动完成的,所以这个空字符对于SDS的使用者来说是完全透明的。遵循空字符结尾这一惯例的好处是,SDS可以直接重用一部分C字符串函数库里的函数。
举个例子,如果我们有一个指向图2-1所示SDS的指针s,那么可以直接使用<stdio.h>/printf函数,通过执行以下语句:
printf("%s",s->buf);
来打印出SDS保存的字符串值"Redsi",而无需为SDS编写专门的打印函数。
**下面图2-2 展示了另一个示例。**这个SDS和之前展示的SDS一样,都保存了字符串值"Redis"。这个SDS和之前的区别在于,这个SDS为buf数组分配了5个未使用的字节空间,所以他的free 属性的值为5(图中,使用5个空格来表示5个未使用的字节空间)。
链接: 在2.2章节 会说明SDS 与C字符串的区别,以及为Redis为啥要使用SDS这种数据结构