SDS与C字符串的区别

1,获取字符串的长度方式

c语言字符串:

表示方式是以空字符结尾,确定一个字符串的方法是遍历整个字符串,对每个字符进行计数,直到找到代表结尾的空字符为止,以此方式获取字符串的长度。
 

SDS:

SDS自己构建的结构与C有所差异。不想C一样仅存储自身信息,SDS还保存了字符本身的长度和预分配空间信息

sds.h/sdshdr的结构:

SDS在获取字符串长度时,仅需获取len的值即可

 

2,内存重分配次数

C字符串并不记录自身的长度,所以对应C字符串来讲,每次修改字符串都是需要才重新计算内存空间才能防止溢出或泄漏。

而SDS则不必如此,它储存了空间预分配free的大小。在对SDS进行拼接时会判断free的空间是否足以直接使用而不重新分配,满足则直接使用,相反,

SDS会计算分配空间,并且分配一块与修改后buf大小的空间给free,以便下次修改使用。如果是一个截断字符的操作,这时SDS也并未直接释放,而是

将这块空间分配给了free,等以后使用。个人觉得这种策略的缺陷是以速度牺牲部分了内存空间。

3,二进制安全

C字符串的字符必须符合某种编码(比如ASCII),并且除字符串的末尾外,字符串里不能包含空字符,否则将会被误认为是字符串的结尾,这些限制使得

C字符串只能保存文本数据,而SDS则不同。

 

 

 SDS API

sdsnew                     创建一个新的SDS

sdsempty                  创建一个空SDS

sdsfree                     释放给定的SDS

sdslen                       返回SDS已使用的空间字节数

sdsavail                     返回SDS未使用的空间字节数

sdsdup                      创建一个SDS副本(copy)

sdsclear                    清空SDS字符串

sdscat                       将给定的C字符串拼接到SDS字符串末尾

sdscatsds                  将一个SDs字符串拼接到另一个SDS字符串末尾

sdscpy                      将给定的C字符串复制到SDS里面,覆盖SDS原有的字符串

sdsgrowzero              用空字符将SDS扩展至指定长度

sdsrange                   保留SDS给定区域的数据,不在区间范围内的数据将被清除

sdstrim                     接收一个SDS和C字符串参数,从SDS左右两端分别移除所有在C字符串中出现的字符

sdscmp                     对比两个字符串是否相同

 

 

签名档:要拥有水滴石穿的毅力和情人般的热情。
 
 
 
分类: redis

guolin

guolin

相信世界,向往美好,记录成长过程,分享个人心得,充实平凡生活。 网站信条:因为喜欢,所以热爱。

发表评论

电子邮件地址不会被公开。 必填项已用*标注