前言:文章中所提redis源码均为redis3.0版本
阅读SDS数据结构实现时,发现如下代码:
struct sdshdr *sh = (void*)(s-(sizeof(struct sdshdr)));
s的类型是sds实际上是char *
typedef char *sds;
通过阅读源码可知,这个s是是指向buf的,而不是整个sdshdr,sdshdr结构体如下:
struct sdshdr {
// buf 中已占用空间的长度
int len;
// buf 中剩余可用空间的长度
int free;
// 数据空间
char buf[];
};
s - (sizeof(struct sdshdr))即内存地址为结构体头部位置(buf部分是不计入结构体大小的,这是一个柔性数组)