美文网首页
SDS与C字符串的区别

SDS与C字符串的区别

作者: 西葫芦炒胖子 | 来源:发表于2018-12-26 15:57 被阅读0次

根据传统, C 语言使用长度为 N+1 的字符数组来表示长度为 N 的字符串, 并且字符数组的最后一个元素总是空字符 '\0' 。

区别1:

C 字符串并不记录自身的长度信息,获取一个C字符串的长度,必须遍历整个字符串,对遇到的字符进行计数,直到遇到代表字符串结尾的空字符为止,复杂度为O(n)

SDS 在len属性中记录了SDS的本身长度,复杂度为O(1)

区别2:

C字符串不记录自身长度容易造成缓冲区溢出

SDS 的空间分配策略完全杜绝了发生缓冲区的可能性:当SDS API 需要对SDS进行修改时,API会先检查SDS的空间是否满足修改所需的要求,如果不满足的话,API会自动将SDS的空间扩展至执行修改所需的大小,然后才执行实际的修改操作,所以使用SDS既不需要修改SDS的空间大小,也不会出现前面所说的缓冲区溢出问题。

区别3:减少修改字符串时带来的内存重分配次数

C字符串的长度和底层数组的长度之间存在这种关联性,所以每次增长或者缩短一个C字符串,总要对保存C字符串的数组进行一次内存重分配操作

在SDS中,buf数组的长度不一定就是字符数量加一,数组里面可以包含为使用的字节,而这些字节的数量就由SDS的free属性记录。通过未使用空间,SDS实习了空间预分配和惰性空间释放两种优化策略.

区别3:二级制安全

C字符串必须符合某种编码,并且除了字符串的末尾之外,字符串里面不能包含空字符。

SDS的API都是二进制安全的,所有SDS API都会以处理二进制的方式来处理SDS存放在buf数组里的数据

区别4:兼容部分C字符串函数

详细区分:

图1

参考地址:http://redisbook.com/preview/sds/different_between_sds_and_c_string.html  





























相关文章

  • SDS简单动态字符串

    SDS(simple dynamic string) 简单动态字符串 SDS数据结构 SDS与C字符串的区别 C字...

  • Redis-第九章节-动态字符串

    目录 概述 SDS(动态字符串) SDS(动态字符串)与c语言字符串的区别 1、概述 String类型底层实现的简...

  • Redis数据结构与对象

    1.简单动态字符串 每个sds.h/sdshdr结构表示一个SDS值,Redis是C语言写的。 与C字符串的区别:...

  • Redis的数据结构与对象

    SDS 数据结构 SDS 与 C C获取字符串长度:O(n),SDS获取字符串长度:O(1)。 SDS对字符串操作...

  • Redis-简单动态字符串

    Redis SDS与C字符串区别 Redis没有直接使用C语言传统的字符串,而自己构建了一种简单动态字符串(Sim...

  • Redis 数据结构之SDS

    SDS[simple dynamic string]是redis区别于C语言的字符串存储结构,名曰简单动态字符串;...

  • SDS与C字符串的区别

    根据传统, C 语言使用长度为N+1的字符数组来表示长度为N的字符串, 并且字符数组的最后一个元素总是空字符'\0...

  • Redis设计与实现-读后总结

    数据结构 Redis字符串 (SDS) ​ 相比C字符串区别 通过len属性,获取字符串长度复杂度为O(1) ...

  • sds.c

    Redis的字符串,没有采用C原生的字符串,而是使用了sds。SDS,Simple Dynamic Strings...

  • redis 内部数据结构(1.1)-字符串

    简单动态字符串 sds 数据结构 与 C 中字符串结构不同的是,C语言需要遍历字符串以确认字符串结束的位置(On)...

网友评论

      本文标题:SDS与C字符串的区别

      本文链接:https://www.haomeiwen.com/subject/ypihlqtx.html