[SDS阅读理解/2]源码中的数据结构

这节讲下sds所用到的数据

先贴代码

typedef char *sds;

/* Note: sdshdr5 is never used, we just access the flags byte directly.
 * However is here to document the layout of type 5 SDS strings. */
struct __attribute__ ((__packed__)) sdshdr5 {
    unsigned char flags; /* 3 lsb of type, and 5 msb of string length */
    char buf[];
};
struct __attribute__ ((__packed__)) sdshdr8 {
    uint8_t len; /* used */
    uint8_t alloc; /* excluding the header and null terminator */
    unsigned char flags; /* 3 lsb of type, 5 unused bits */
    char buf[];
};
struct __attribute__ ((__packed__)) sdshdr16 {
    uint16_t len; /* used */
    uint16_t alloc; /* excluding the header and null terminator */
    unsigned char flags; /* 3 lsb of type, 5 unused bits */
    char buf[];
};
struct __attribute__ ((__packed__)) sdshdr32 {
    uint32_t len; /* used */
    uint32_t alloc; /* excluding the header and null terminator */
    unsigned char flags; /* 3 lsb of type, 5 unused bits */
    char buf[];
};
struct __attribute__ ((__packed__)) sdshdr64 {
    uint64_t len; /* used */
    uint64_t alloc; /* excluding the header and null terminator */
    unsigned char flags; /* 3 lsb of type, 5 unused bits */
    char buf[];
};

       我们可以看到,sds这个所谓的字符串类型,实质就是C语言里头的char*,一般的做法是用一个结构体封装,然而作者没采用这种方法,作者的这种方法也提供了一些便利,具体原因看官方说明文档就清楚了。
       虽然没有用结构体封装要操作的字符串,但源码里还是用到了结构体。从上面的代码里可以看到,共有5种类型的结构体。作者在注释里也说明了,我们不会用到第一种类型的结构体,所以不用管它。其余4种结构体在形式上一样,只是每个结构体本身所占的字节数不一样,因为它们里头的lenalloc元素所使用的数据类型不一样,uint*_t这类数据类型来自<stdint.h>。这是为了达到通用性,在不同位数操作系统中都能使用,讲宏那节也说过。下面说下结构体中每个元素的意义-

len      - 用来记录字符串的长度
alloc   - 我们总共申请的空间大小,除头结构体和末尾的空字符
flags   - 用来标识字符串的类型
buff[] - 一个未指定长度的数组,用来存放字符串

关于零长度数组,建议看看这篇文章C语言结构体里的成员数组和指针。多看几遍就清楚了。


       sds变量和结构体有什么关系呢?下面重点讲解下。看截图-
截图来自官方文档
这是作者描述的每创建一个字符串后,它在内存中的排列方式。要看懂图片表达的意思,得看看源码中创建字符串的函数内部逻辑,这里就先不讲函数逻了。Header就是上面提到的其中一个类型的结构体,它储存一些相关信息(上面有提到),结构体最后那个零长度数组是不占结构体内存的,它只是一个占位符,当我们给结构体申请空间时,容量大于该结构体,那多出来的空间,我们就可以通过buf[0] buf[1]等这样的数组元素来访问空间中的内容。图片中间那一大段空间就是多申请的,创建一个sds变量后,就用它指向这段内存的起始地址,我们就可以用它来储存字符串了。最后面存的是一个结束符NULL。理解了所使用的数据结构后,就可以继续学习API的逻辑部分了。


       这节就记录到这里。:)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值