redis源码阅读理解,及相关语言细节---sds.c

本文探讨Redis源码中sds.c的实现,sds是优化过的C语言动态字符串。文章详细解释了sds的内存结构、sdshdr结构体、内联函数以及动态字符串长度的获取方式,展示了Redis作者对内存管理和C语言的深刻理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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* 所以这样赋值就会出现问题,但是很关键的一点就是这种写法只是为了兼容之前的程序,所以这个写法最后是一定会被抛弃的,所以我特意说一下,希望之后能够避免这种写法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值