redis使用sds代替char *字符串,
其定义如下:
typedef char *sds; struct sdshdr { unsigned int len; unsigned int free; char buf[]; };
sds指向了char 字符串
sdshdr是字符串头
结构比较巧妙
使用char buf[]存放字符串实际内容
注意char *buf和char buf[]是不同的
sizeof(sdshdr)等于8,而不是我以为的12
连续内存结构如下:
0----7 sdshdr
8----以后 sds ,同时也是buf位置
建立sds的方法
sds sdsnewlen(const void *init, size_t initlen) { struct sdshdr *sh; if (init) { sh = zmalloc(sizeof(struct sdshdr)+initlen+1); } else { sh = zcalloc(sizeof(struct sdshdr)+initlen+1); } if (sh == NULL) return NULL; sh->len = initlen; sh->free = 0; if (initlen && init) memcpy(sh->buf, init, initlen); sh->buf[initlen] = '