第二章 SDS(simple dynamic string)简单动态字符串。
struct sdshdr {
//记录buf数组中已使用的字节数,等于sds所保存的字符串长度
int len;
//等于buf数组中未使用的字节数量
int free;
//字节数组,用于保存字符串
chat buf[];
}
SDS和C字符串的对比
| SDS/C字符串 | 获取长度时间复杂度 | API安全性 | 修改长度内存分配 | 保存数据类型 | 使用<string.h>库函数 |
|---|---|---|---|---|---|
| C字符串 | O(N) | 不安全,可能会缓冲区溢出 | 修改长度N次必然要执行N次重新内存分配 | 只能保存文本数据 | 所有可用 |
| SDS | O(1) | 安全,不会缓冲区溢出 | 修改长度N次最多执行N次重新内存分配 | 文本数据或二进制数据 | 部分可用 |
- API安全:SDS的API对SDS进行修改时,会检查目前空间是否满足修改所需要求,不满足时会重新分配内存,原生的C字符串不会。
- SDS修改字符串修改长度时内存分配策略:1 所需空间不足,如果修改后sds的len小于1MB,将分配和len同样大小的未使用空间。如修改过之后SDS的len为13字节,程序将分配13字节未使用空间给SDS,buf实际长度变为13(已使用) + 13(未使用) + 1(‘\0’保存空字符) = 27。如果修改后len大于1MB,将新分配1MB未使用空间给SDS。 2 缩短字符串的操作,并不会实际释放多余空间,会将多数来的空间保存在free中,等下次需要时直接使用。另外SDS提供了API用来实际释放未使用的空间。
- 二进制安全 SDS的API都是二进制安全的,API都处理二进制的方式处理存放在buf里面的数据,所以一些特殊数据格式也是可以保存的(比如中间包含/0的字符串),因此buf才叫做字节数组。