STL源码剖析学习二:空间配置器(allocator)
STL源碼剖析學習二:空間配置器(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把內存配置和對象的構造分開
allocate負責內存配置,deallocate負責內存的釋放
construct負責對象構造,destroy負責對象析構
?
SGI std::alloc設計思想:
1.向system heap要求空間
2.考慮多線程狀態
3.考慮內存不足的應變措施
4.考慮過多小型區塊導致的內存碎片問題
以malloc和free完成內存的配置與釋放
?
考慮過多小型區塊導致的內存碎片問題,SGI設計了雙層配置器
1.當配置區塊大于128bytes時,調用第一級配置器,直接使用malloc和free
2.當配置區塊小于128bytes時,調用第二級配置器,采用內存池的整理方式
?
第一級配置器:
1.allocate直接使用malloc
2.deallocate直接使用free
3.當內存不足時,用malloc free realloc執行實際的內存配置、釋放、重配置操作,以實現出類似于c++中new-handler的機制
new-handler的機制:可以要求系統在內存配置需求無法滿足的情況下,調用一個你指定的函數
==>一旦new無法完成任務,在丟出bad_alloc異常之前可以先調用指定的處理函數
?
第二級配置器:
當配置的內存較小時,用內存池的方式管理(次層配置):
每次配置一大塊內存,并且維護一個自由鏈表,下次若有相同大小的內存需求,則直接從自由鏈表中取出,若有釋放的內存則收入到自由鏈表中。
為方便管理,將任何小額區塊的內存需求量上調至8的倍數
當自由鏈表中沒有可用區塊時調用refill,為自由鏈表重新填充空間。
新的空間將由chunk_alloc完成
?
chunk_alloc:
判斷內存池中的內存,若果足夠,則分出20個區塊給自由鏈表
如果不足20個,但至少有一個,則有多少撥多少
如果一個都沒有,則利用malloc從heap中配置內存,注入內存池中
要是整個system heap中內存都不夠了,則尋找是否有尚有未用區塊且區塊足夠大的自由鏈表,有的話就挖出來用
如果還沒有,則調用第一級配置器,new-handler機制
如果還不行,就bad_alloc異常
內存基本處理工具:
uninitialized_copy:為了將內存的配置跟對象的構造分離開來,對調用拷貝構造函數來構造未初始化區域中的對象,調用construct
調用的結果是要么構造出全部對象,要么就什么都沒有
uninitialized_fill
uninitialized_fill_n
上述三個函數分別對應高層的STL算法copy(),fill(),fill_n()
?
轉載于:https://www.cnblogs.com/w0w0/archive/2012/04/21/2461378.html
總結
以上是生活随笔為你收集整理的STL源码剖析学习二:空间配置器(allocator)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS网络请求安全认证(JWT,RSA)
- 下一篇: E20171214-sl