string类的大小

C++中有一个和c一样的类string

这个类非常奇怪,首先说明我疑惑的地方

string sz = "hello\0world";
string ch;
printf("%d,%d,%d,%d,%d,%d,%d",sz.size(),sz.capacity(),sizeof(sz),sizeof(string),ch.size(),ch.capacity(),sizeof(ch));

猜猜输出是什么?(在vs2010编译环境下)

程序输出结果是5,15,32,32,0,15,32.

这里我的理解是成员函数size()表示对象实际含有的元素数,而成员变量表示初始分配给对象所能容纳的最大元素数。那么sizeof表示对象占用空间大小。并且在string类中\0具有截断功能,使得size()不再查看后面的内容。当实际含有的元素数超过初始分配的最大容量时,那么系统将会再给对象分配16个字节。例如:

         string ch;
	string sz ="helloahaaaahhhaaaaaaaaaaaaaaaaaaaaaaa";
	char *p = (char *)&sz;
	printf("%d,%d,%d,%d,%d,%d,%d\r\n",sizeof(ch),ch.size(),ch.capacity(),sizeof(sz),sz.size(),sz.capacity(),sizeof(string));
	printf("%s\r\n",sz);
	printf("%s\r\n",p+6);

输出结果是 32,0,15,37,47,32。上述后两个printf输出为乱码。这个47是怎么得来的呢?首先为sz分配了15个内存空间,但是发现内存不足(实际有37个元素大于15)于是系统又分配了16个对象,但是37>(15+16)于是系统又分配了16个字节的内存空间,这样就得到了15+16+16=47。

为什么后两个printf会失败呢?

首先如果sz中含有的元素个数小于或等于15就能正确打印出来,一旦大于这个数将会打印出乱码。

但是p必须要偏移4个字节才能打印出对应的内容。string类中前4个字节到底是什么东西呢

通过调试发现存储着【D8】【4f】【7f】【00】这几个内容,但是这既不是容量大小0xF(15)也不是元素个数15的大小。到底是个什么东西呢?

查看内存中是个dc数值,用ASCII吗表示是个?号。好奇怪的东西。string类前几个到底是啥呢?


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值