STL源码剖析学习二:空间配置器(allocator)
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS网络请求安全认证(JWT,RSA)
- 下一篇: E20171214-sl