SDS是simple dynamic string的缩写,简称简单动态字符串。
一、SDS结构
struct sdshdr { // 记录 buf 数组中已使用字节的数量 // 等于 SDS 所保存字符串的长度 int len; // 记录 buf 数组中未使用字节的数量 int free; // 字节数组,用于保存字符串 char buf[]; };
free
属性的值为0
, 表示这个 SDS 没有分配任何未使用空间。len
属性的值为5
, 表示这个 SDS 保存了一个五字节长的字符串。buf
属性是一个char
类型的数组, 数组的前五个字节分别保存了'R'
、'e'
、'd'
、'i'
、's'
五个字符, 而最后一个字节则保存了空字符'\0'
。
二、SDS和C字符串的区别
- C 字符串
获取字符串长度的复杂度为 O(N) 。
API 是不安全的,可能会造成缓冲区溢出。
修改字符串长度 N 次必然需要执行 N 次内存重分配。
只能保存文本数据。
可以使用所有 <string.h> 库中的函数。 可以使用一部分 <string.h> 库中的函数。
- SDS
获取字符串长度的复杂度为 O(1) 。(SDS结果中存储了len属性)
API 是安全的,不会造成缓冲区溢出。(自动分配内存)
修改字符串长度 N 次最多需要执行 N 次内存重分配。
可以保存文本或者二进制数据。
可以使用一部分 <string.h> 库中的函数。