string源码实现分析
2024-09-02 17:14:56
最近写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的部分开始不同
为什么string一样的值,会不同,原因应该是string的数据结构的问题
a=string("");
b=string(""); printf("%d\n",sizeof(a));
printf("%d\n",sizeof(b));
再一测,果然有问题,打印结果都是32,相当于这里的32个字节里保存了一些基本信息,但是文字内容都放在了其他的地方!!!
可以明显的看到a,b的差别
如果字符短的话,string就把字符串放到buf里,buf占16个字节,而如果字符串比较长的话,就把字符串放到_Ptr所指向的内存里
_Mysize记录当前字符串的大小,_Myres记录当前动态的内存结束点(0开始)
最新文章
- intellij idea 12 编码不可映射字符
- Win7 U盘安装Ubuntu16.04 双系统详细教程
- 1250 Super Fast Fourier Transform(湘潭邀请赛 暴力 思维)
- AUTOIT解决域控普通用户以管理员身份安装软件方法
- java名词解释
- git管理工具的使用教程
- 找啊找啊找GF
- NGUI 3.5教程(六)Font字体
- delphi参数传递
- Powershell profile.ps1 cannot be loaded because its operation is blocked by software restriction policies
- Java ------------获取不会重复的随机数
- Java基础笔记-多线程
- CodeForces 384C Milking cows
- Python 接口测试(三)
- install g++ on windows
- Python学习笔记6
- HDMI转MIPI DSI芯片方案TC358870XBG
- 浅析Python多线程
- oracle ORA-00917: missing comma 是因为少逗号
- 关于Java中static关键字的用法以及从内存角度解析
热门文章
- CentOS7 LDAP 2.4 安装配置
- Ubuntu 无法获得锁
- 七种常见经典排序算法总结(C++)
- SC用法
- [sqlite] 判断表、视图是否存在及常用C#操作语句
- 关于px em rem的一点小总结
- C++面向对象高级编程(三)基础篇
- Django-RestfulFramework --- DRF
- encodeURI()和encodeURIcomponent()的共同点和不同点
- ios 10.3下载 Xcode8配置支持 ios 10.3下载