最近写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=;//string("213");
temp.x=i*;
temp.str=string("");

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

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

string源码实现分析-LMLPHP

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

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

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

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

string源码实现分析-LMLPHP

string源码实现分析-LMLPHP

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

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

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

05-28 18:42