简单动态字符串 结构
1 | struct sdshdr { |
buf以'\0'
为作为字符串结束符,为了能使用C语言本身的库
SDS设计对比C语言字符串的优势:
- 获取字符串长度的时间复杂度 O(1)
- 避免缓冲区溢出情况
- 在拼接扩展字符串时,先检测free是否有足够的容量加载新字符,无则新分配内存
- 减少修改字符串带来的内存重新分配次数:
- 空间预分配:在做空间扩展时,不仅会分配必须的内存大小,还会额外分配未使用空间。额外分配规则:
- 如果分配后,sds->len大小小于1M,将分配额外空间大小为sds->len。例如:修改后len大小为13,则会分配free=13,最终buf的字节长度为 13(len)+13(fee)+1(
'\0'
) = 27; - 如果分配后,sds->len大小 大于 1M,将分配额外空间大小为1M。例如,修改后len大小为30M,则会分配free=1M,最终buf的字节长度为 30M + 1M +1byte
- 惰性空间释放
- 避免内存重新分配
- 为将来可能有的增长操作提供了优化
- 如果分配后,sds->len大小小于1M,将分配额外空间大小为sds->len。例如:修改后len大小为13,则会分配free=13,最终buf的字节长度为 13(len)+13(fee)+1(
- 空间预分配:在做空间扩展时,不仅会分配必须的内存大小,还会额外分配未使用空间。额外分配规则:
- 二进制安全
- 在C语言中,如果存在
'\0'
,则会终止取值。二进制的内容可能存在该字符,所以在C语言中是不安全的,但sds是根据len取值 - 兼容部分 C 字符串函数。
- 在C语言中,如果存在