// sdshdr 结构
struct sdshdr {
// buf 已占用长度
int len;
// buf 剩余可用长度
int free;
// 实际保存字符串数据的地方,会分配多一个字节用于存放'\0';
char buf[];
};
REDIS的字符串一般保存在以sdshdr为头的结构中, 字符串放在buf[]中,len表示字符串的长度,不包括结尾的'\0', free表示预分配的buf[]中还有多少可以使用, 当需要对字符串进行append时,就需要先检查free是否够用,如果不够用就需要重新分配内存.
一般使用动态字符串的API时,一般只要传递字符部分buf[],在API内部采用指针的移动来获取字符串的头部域.
sdshdr的这种结构buf[]部分在内存中是不占内存的, 即
sizeof(struct adshdr) ==8;