SDS结构设计
SDS 结构里包含了一个字符数组 buf[],用来保存实际数据。
创建字符串函数:sdsnewlen
字符串追加函数:sdscatlen
和 C 语言中的字符串操作相比,SDS 通过记录字符数组的使用长度和分配空间大小,避免了对字符串的遍历操作,降低了操作开销,进一步就可以帮助诸多字符串操作更加高效地完成,比如创建、追加、复制、比较等,这一设计思想非常值得我们学习。
紧凑型字符串结构的编程技巧
SDS 一共设计了 5 种类型,分别是 sdshdr5、sdshdr8、sdshdr16、sdshdr32 和 sdshdr64。这 5 种类型的主要区别就在于,它们数据结构中的字符数组现有长度 len 和分配空间长度 alloc,这两个元数据的数据类型不同。
SDS 之所以设计不同的结构头(即不同类型),是为了能灵活保存不同大小的字符串,从而有效节省内存空间。因为在保存不同大小的字符串时,结构头占用的内存空间也不一样,这样一来,在保存小字符串时,结构头占用空间也比较少。
在 struct 和 sdshdr8 之间使用了__attribute__ ((packed)),如下所示:
struct __attribute__ ((__packed__)) sdshdr8
attribute ((packed))的作用就是告诉编译器,在编译 sdshdr8 结构时,不要使用字节对齐的方式,而是采用紧凑的方式分配内存。
此文章为10月Day2学习笔记,内容来源于极客时间《Redis 源码剖析与实战》