zoukankan      html  css  js  c++  java
  • Redis源码研究--字符串

    之前看的内容,占个位子,以后补上。

    ------------8月2日-------------

    好久没看了,惭愧,今天抽了点时间重新看了Redis的字符串,一边写博客,一边看。

    Redis的字符串主要在sds.h、sds.c文件中。打开sds.h,发现代码也不多。贴一下

    1 typedef char *sds;
    2 
    3 struct sdshdr {
    4     int len;
    5     int free;
    6     char buf[];
    7 };

    看到了没,sds其实就是个char* ,刚开始看到这里,觉得好失望,这不是骗国家的钱吗,往下看,发现没这么简单,还牵扯到指针操作。

    sds和sdshdr数据结构是关联在一块的,可以把sdshdr里的buf看成sds,给你sds的地址,我们就能知道sdshdr的地址。头文件代码里就有

    1 static inline size_t sdslen(const sds s) {
    2     struct sdshdr *sh = (void*)(s-(sizeof(struct sdshdr)));
    3     return sh->len;
    4 }

    指针往前移动了两个int大小,这里有人可能会有另外一个疑惑,sizeof(struct sdshdr)怎么是两个int大小呢???

    仔细看发现char buf[]都没有分配空间,其实这是c99新加的特性,貌似叫动态数组,不占存储空间。

    下面那个函数inline也是c99中加的,与C++中的inline差不多。

    看明白了这些,头文件里基本就没什么东西了。

    然后想想,为什么Redis不用char *,而是用这个sdshdr结构体,看结构体里的东西,len 与free,没错。len是求字符串长度,len + free 是总共分配的空间。

    因为char *如果要求字符串长度,需要挨个遍历,复杂度是O(n),而且一旦char * 确定了,想要追加,只能重新再分配一个。

  • 相关阅读:
    Zstack中任务,事件,消息之间的关系
    Zigbee折腾之旅:(一)CC2530最小系统
    计算机中原码,反码,补码之间的关系
    Python3
    Python3
    Python3
    【基础】强软弱虚引用
    SpringBoot上传文件时MultipartFile报空问题解决方法
    Mockito中的@Mock和@Spy如何使用
    Vim 多行剪切、复制和删除
  • 原文地址:https://www.cnblogs.com/feiyunruyue/p/3150820.html
Copyright © 2011-2022 走看看