sds即动态字符串,这节的代码主要是自己构造的字符串,相当于优化了之前的c语言结构的字符串,因为redis对于数据的处理速度有着很高的要求,所以对于底层的规划势必要做一个完全的优化调整,所以也就有了这个文件的内容,c语言是不会记录字符串长度的,而对于redis这显然是无法接收的,前面在学习malloc的时候也提到了,redis在申请的时候不仅仅要求数据对齐,同时还对数据的大小有着更高的要求,申请的内存全部都是8的倍数,当然这只是要说的一小部分,接下来,还是按照我之前的习惯,首先放上sds.h的头文件定义相关代码:
typedef char *sds;
// sdshdr 结构
struct sdshdr {
// buf 已占用长度
int len;
// buf 剩余可用长度
int free;
// 实际保存字符串数据的地方
// 利用c99(C99 specification 6.7.2.1.16)中引入的 flexible array member,通过buf来引用sdshdr后面的地址,
// 详情google "flexible array member"
char buf[];
};
/*
* 返回 sds buf 的已占用长度
*/
static inline size_t sdslen(const sds s) {
struct sdshdr *sh = (void*)(s-(sizeof(struct sdshdr)));
return sh->len;
}
/*
* 返回 sds buf 的可用长度
*/
static inline size_t sdsavail(const sds s) {
struct sdshdr *sh = (void*)(s-(sizeof(struct sdshdr)));
return sh->free;
}
首先是宏定义了一个char*类型的变量,变量的名字是sds,
-------------------------------------------跑题的分割线---------------------------------------------------------------------
说起char*我认为这个简直就是c系语言里面最神奇的一种类型了,当然这并不是我们关注的重点,所以现在我们就不对这个进行讨论,如果对char*有兴趣的同学可以去参考一下这篇文章点击打开链接,但是我还是要说明一点char*str="hello";这种写法是可以出结果的,但是会有警告,为什么会有警告呢,原因很简单"hello"的数据类型是const char* 所以这样赋值就会出现问题,但是很关键的一点就是这种写法只是为了兼容之前的程序,所以这个写法最后是一定会被抛弃的,所以我特意说一下,希望之后能够避免这种写法