数据结构定义:
struct sdshdr {
long len;
long free;
char buf[];
};
1) buf是一个变长数组,指向真正的字符串,非指针*;
2) len存储字符串总长度,保证o(1)的长度获取操作;
3) free存储空闲字符长度.
简短精悍.
新建一个字符串:
sds sdsnewlen(const void *init, size_t initlen) {
struct sdshdr *sh;
sh = zmalloc(sizeof(struct sdshdr)+initlen+1);
#ifdef SDS_ABORT_ON_OOM
if (sh == NULL) sdsOomAbort();
#else
if (sh == NULL) return NULL;
#endif
len = initlen;
free = 0;
if (initlen) {
if (init) memcpy(buf, init, initlen);
else memset(buf,0,initlen);
}
buf[initlen] = '\0';
return (char*)buf;
}
由字符串获取原数据结构并访问:
size_t sdslen(const sds s) {
struct sdshdr *sh = (void*) (s-(sizeof(struct sdshdr)));
return len;
}
这种trick在是否新建redisObject时是否使用VM也有使用.
真正的深思熟虑的代码,套用一句常用语:学习了.