京峰二进制安全逆向高级班录播课程(反汇编加密解密病毒分析)
这种简单的字符串表示,在大多数情况下都能满足要求,但是,它并不能高效地支持长度计算和追加(append)这两种操作:
每次计算字符串长度(
strlen(s)
)的复杂度为 O(N)。对字符串进行 N 次追加,必定需要对字符串进行 N 次内存重分配(
realloc
)。
而redis除了要处理c语言字符串之外,还需要处理redis的服务器协议等等。所以,redis实现的sds(简单动态字符串),是二进制安全的。
数据结构的定义如下:
typedef char *sds;
struct sdshdr {
// buf 已占用长度
int len;
// buf 剩余可用长度
int free;
// 实际保存字符串数据的地方
char buf[];
};