日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STL源码剖析学习二:空间配置器(allocator)

發(fā)布時間:2023/12/9 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STL源码剖析学习二:空间配置器(allocator) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

STL源碼剖析學(xué)習(xí)二:空間配置器(allocator)


標準接口:
vlaue_type
pointer
const_pointer
reference
const_reference
size_type
difference_type
rebind
allocator()--default constructor
allocator(const allocator<U>&--copy constructor
~allocator()--destructor
address(reference x)const--return address of elem
address(const_reference x)const
allocate(size_type n, const void*= 0)--alloc memory
deallocator(pointer p, size_type n)--return memory
max_size()--return memory alloc succesfully
construct(pointer p, const T& x)--=new((void*) p) T(x)
destroy()--=p->T()

?

STL allocator把內(nèi)存配置和對象的構(gòu)造分開
allocate負責(zé)內(nèi)存配置,deallocate負責(zé)內(nèi)存的釋放
construct負責(zé)對象構(gòu)造,destroy負責(zé)對象析構(gòu)

?

SGI std::alloc設(shè)計思想:
1.向system heap要求空間
2.考慮多線程狀態(tài)
3.考慮內(nèi)存不足的應(yīng)變措施
4.考慮過多小型區(qū)塊導(dǎo)致的內(nèi)存碎片問題

以malloc和free完成內(nèi)存的配置與釋放

?

考慮過多小型區(qū)塊導(dǎo)致的內(nèi)存碎片問題,SGI設(shè)計了雙層配置器
1.當配置區(qū)塊大于128bytes時,調(diào)用第一級配置器,直接使用malloc和free
2.當配置區(qū)塊小于128bytes時,調(diào)用第二級配置器,采用內(nèi)存池的整理方式

?

第一級配置器:
1.allocate直接使用malloc
2.deallocate直接使用free
3.當內(nèi)存不足時,用malloc free realloc執(zhí)行實際的內(nèi)存配置、釋放、重配置操作,以實現(xiàn)出類似于c++中new-handler的機制

new-handler的機制:可以要求系統(tǒng)在內(nèi)存配置需求無法滿足的情況下,調(diào)用一個你指定的函數(shù)
==>一旦new無法完成任務(wù),在丟出bad_alloc異常之前可以先調(diào)用指定的處理函數(shù)

?

第二級配置器:
當配置的內(nèi)存較小時,用內(nèi)存池的方式管理(次層配置):
每次配置一大塊內(nèi)存,并且維護一個自由鏈表,下次若有相同大小的內(nèi)存需求,則直接從自由鏈表中取出,若有釋放的內(nèi)存則收入到自由鏈表中。
為方便管理,將任何小額區(qū)塊的內(nèi)存需求量上調(diào)至8的倍數(shù)

當自由鏈表中沒有可用區(qū)塊時調(diào)用refill,為自由鏈表重新填充空間。
新的空間將由chunk_alloc完成

?

chunk_alloc:
判斷內(nèi)存池中的內(nèi)存,若果足夠,則分出20個區(qū)塊給自由鏈表
如果不足20個,但至少有一個,則有多少撥多少
如果一個都沒有,則利用malloc從heap中配置內(nèi)存,注入內(nèi)存池中
要是整個system heap中內(nèi)存都不夠了,則尋找是否有尚有未用區(qū)塊且區(qū)塊足夠大的自由鏈表,有的話就挖出來用
如果還沒有,則調(diào)用第一級配置器,new-handler機制
如果還不行,就bad_alloc異常


內(nèi)存基本處理工具:
uninitialized_copy:為了將內(nèi)存的配置跟對象的構(gòu)造分離開來,對調(diào)用拷貝構(gòu)造函數(shù)來構(gòu)造未初始化區(qū)域中的對象,調(diào)用construct
調(diào)用的結(jié)果是要么構(gòu)造出全部對象,要么就什么都沒有
uninitialized_fill
uninitialized_fill_n
上述三個函數(shù)分別對應(yīng)高層的STL算法copy(),fill(),fill_n()

?

轉(zhuǎn)載于:https://www.cnblogs.com/w0w0/archive/2012/04/21/2461378.html

總結(jié)

以上是生活随笔為你收集整理的STL源码剖析学习二:空间配置器(allocator)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。