SDS:
主要由free、len、buf三个组成,分别记录剩余的长度、当前字符串的长度和字符串。它是通过预分配和惰性空间释放来减少内存分配操作,
预分配策略:每次存字符串的时候如果小于1m则分配与字符串相同的大小,额外加一个1位的\0结尾符,如果是2k长度字符串则问4k + 1大小的内存空间。如果超过1m,加入说30m,只会多给出来1m空间,外加\0,也就是30m+1m+1b
惰性空间释放:指当某个值长度由大变小时,不会立即释放空间,而是会把剩余的空间size记录到free里,在下次使用时可以先判断是否够用,同时在适当的时候也会自动调用sdsfreesdsfree来释放空间。减少空间浪费。
len本身可以减少每次计算sds字符串长度。同时还能杜绝缓冲区溢出。每次修改时均可以调用sdslen来判断当前使用的空间及剩余的空间。同时len也保证了二进制安全。
总结:相比较c,sds有以下优点:
1、简化常用获取字符串的复杂度
2、杜绝缓冲溢出
3、减少修改字符串长度时重新分配内存的次数。
4、二进制安全。
5、兼容部分c字符串函数。