STL库中string类内存布局的探究

在STL中有着一个类就是string类,他的内存布局和存储机制究竟是怎么样的呢?

这就是建立好的string

可以看出,图中用黄色框框标注的部分就是主要区域

我们用来给string对象进行初始化的字符串被存储在了_Buf当中,_Mysize和_Myres就不用说了,就是上面的size 和 capacity 的值。

当只有一个字符作为字符串的时候,就可以很明显的看出来了,_Mysize是指字符串的length

_Myres还是没有改变,_Myres最大就是15么?

此时还没有变化,再加入一个字符

可以变成31个,为什么一直都是2的几次方-1呢,string是字符串,默认给字符串留下一个结束符'\0'的空间

并且当你给的初始化字符串超过15个的时候,我们存储字符串的位置就改变了,不是在_Buf中而是转到了Ptr这个指针当中去了

这是因为string会实现分配16个字节的空间,当存储的字符串长度大于16个字节的时候,就去另外开辟空间,并把指针赋值给_Ptr,完成string对象的初始化(这与STL库中的内存配置器有关系,当实现分配的空间不满足需要的时候开辟空间)

接下来就来看看,是怎么进行拷贝构造的吧

可以看出,当时用指针的时候并不是进行浅拷贝,而是进行的深拷贝;

那么_Buf也一样么?是的也是进行的 深拷贝

可以看出两部分的_Buf的地址是不一样的

那么也就是说在C++中string类使用的是深拷贝,并且有一个默认的存储缓冲区,大小是16个字节,当存储的字符串长度超出的时候,会使用指针来对字符串进行存储,并且进行拷贝构造的时候两部分都会进行深拷贝。

转载于:https://www.cnblogs.com/lenomirei/p/5354362.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值