STL库中string类内存布局的探究
在STL中有著一個(gè)類就是string類,他的內(nèi)存布局和存儲(chǔ)機(jī)制究竟是怎么樣的呢?
這就是建立好的string
可以看出,圖中用黃色框框標(biāo)注的部分就是主要區(qū)域
我們用來(lái)給string對(duì)象進(jìn)行初始化的字符串被存儲(chǔ)在了_Buf當(dāng)中,_Mysize和_Myres就不用說(shuō)了,就是上面的size 和 capacity 的值。
當(dāng)只有一個(gè)字符作為字符串的時(shí)候,就可以很明顯的看出來(lái)了,_Mysize是指字符串的length
_Myres還是沒(méi)有改變,_Myres最大就是15么?
此時(shí)還沒(méi)有變化,再加入一個(gè)字符
可以變成31個(gè),為什么一直都是2的幾次方-1呢,string是字符串,默認(rèn)給字符串留下一個(gè)結(jié)束符'\0'的空間
并且當(dāng)你給的初始化字符串超過(guò)15個(gè)的時(shí)候,我們存儲(chǔ)字符串的位置就改變了,不是在_Buf中而是轉(zhuǎn)到了Ptr這個(gè)指針當(dāng)中去了
這是因?yàn)閟tring會(huì)實(shí)現(xiàn)分配16個(gè)字節(jié)的空間,當(dāng)存儲(chǔ)的字符串長(zhǎng)度大于16個(gè)字節(jié)的時(shí)候,就去另外開(kāi)辟空間,并把指針賦值給_Ptr,完成string對(duì)象的初始化(這與STL庫(kù)中的內(nèi)存配置器有關(guān)系,當(dāng)實(shí)現(xiàn)分配的空間不滿足需要的時(shí)候開(kāi)辟空間)
接下來(lái)就來(lái)看看,是怎么進(jìn)行拷貝構(gòu)造的吧
可以看出,當(dāng)時(shí)用指針的時(shí)候并不是進(jìn)行淺拷貝,而是進(jìn)行的深拷貝;
那么_Buf也一樣么?是的也是進(jìn)行的?深拷貝
可以看出兩部分的_Buf的地址是不一樣的
那么也就是說(shuō)在C++中string類使用的是深拷貝,并且有一個(gè)默認(rèn)的存儲(chǔ)緩沖區(qū),大小是16個(gè)字節(jié),當(dāng)存儲(chǔ)的字符串長(zhǎng)度超出的時(shí)候,會(huì)使用指針來(lái)對(duì)字符串進(jìn)行存儲(chǔ),并且進(jìn)行拷貝構(gòu)造的時(shí)候兩部分都會(huì)進(jìn)行深拷貝。
轉(zhuǎn)載于:https://www.cnblogs.com/lenomirei/p/5354362.html
總結(jié)
以上是生活随笔為你收集整理的STL库中string类内存布局的探究的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 拳皇97ol八神技能怎么连招?八神连招教
- 下一篇: 顶格申购是什么意思