• string源码实现分析


      最近写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
    ",sizeof(a));
        printf("%d
    ",sizeof(b));

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

     

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

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

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

  • 相关阅读:
    hdu 1754 线段树 注意线段树节点的设计 求什么,设什么
    hdu 4015 概率题
    poj 1950 回溯
    最大上升子序列
    JVM学习博客
    2012
    i am alone at a crossroads
    易知难
    牢骚。。
    something
  • 原文地址:https://www.cnblogs.com/huhuuu/p/3438313.html
Copyright © 2020-2023  润新知