雕刻时光

just do it……nothing impossible
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

string源码实现分析

Posted on 2013-11-22 21:56  huhuuu  阅读(2391)  评论(0编辑  收藏  举报

  最近写hashtable的实现的时候用模板类的思想,在普通int,long,double类型的时候测试时没问题的,当用到string的时候,一直有问题。

  实现的equal函数是比较粗暴的使用两者所有对应内存字节是否相似来比较的。

    bool equal(T a,T b){//用内存中字节的方法判断这块内存的对象的值是否相等,这样就不用关心结构内部的数据类型了
        char *aCurret,*aEnd,*bCurret;
        aCurret=(char *)&a;
        aEnd=aCurret+sizeof(T);
        bCurret=(char *)&b;
        while((*aCurret==*bCurret)&&(aCurret!=aEnd)){
            aCurret++;
            bCurret++;
        }
        if(aCurret==aEnd)return true;
        else false;
    }

   我开始分析两者的数据结构是否相同的

struct data{
    int a,b,c;
    int x;
    string str;
};
        temp.a=temp.b=temp.c=123;//string("213");
        temp.x=i*1;
        temp.str=string("213");

两个赋成一样的值,由于sizeof(data)=48

分别观察结构体1(0012FB3C),和结构体2(0012FB6C)的差别

 

 整数部分都一样,而string的部分开始不同

为什么string一样的值,会不同,原因应该是string的数据结构的问题

    a=string("123");
    b=string("12345678901234567890123");
    
    printf("%d\n",sizeof(a));
    printf("%d\n",sizeof(b));

再一测,果然有问题,打印结果都是32,相当于这里的32个字节里保存了一些基本信息,但是文字内容都放在了其他的地方!!!

 

可以明显的看到a,b的差别

如果字符短的话,string就把字符串放到buf里,buf占16个字节,而如果字符串比较长的话,就把字符串放到_Ptr所指向的内存里

_Mysize记录当前字符串的大小,_Myres记录当前动态的内存结束点(0开始)