關於STL中的空間(內存)配置器:allocator

一般我們在使用STL的時候,空間配置器allocator對於我們是隱藏的。它隱藏在容器之後,進行空間內存的分配、管理、釋放等工作。整個STL的操作對象都存放在容器之內,而容器需要配置空間來存放內容,這個時候,空間配置器就派上作用了。

將allocator稱之爲空間配置器的原因是,空間不一定是內存,也可能是磁盤或其他存儲介質。allocator可以向內存獲得空間,也可以向硬盤取得空間。

STL的配置器(allocator)定義在頭文件memory中,其中包括了三個重要的頭文件:

1、<stl_construct.h> : 這裏面定義了全局函數construct()和destroy(),負責對象的構造和析構。
2、<stl_alloc.h> :定義了一、二級配置器,彼此合作。配置器名爲alloc。
3、<stl_uninitialized.h>:定義了一些全局函數,用來填充(fill)或複製(copy)大塊內存數據。

std::alloc中的雙層級配置器

第一層級配置器直接使用malloc()和free(),第二級配置器視情況採用不同的策略:當配置區塊超過128bytes時,視之爲“足夠大”,便調用第一級配置器;當配置區塊小於128bytes時,視之爲“過小”,爲了降低額外負擔,便採用複雜的內存池整理方式,而不再求助於第一級配置器。

二級配置器的做法是,如果區塊足夠大,超過128bytes時,就移交第一級配置器處理。當區塊小於128bytes時,則以內存池管理,此法又稱爲次層配置:每次配置一大塊內存,並維護對應的自由鏈表。下次若再有相同大小的內存需求,就直接從自由鏈表中撥出。如果有小額區塊被釋放,就由配置器回收到自由鏈表中,也就是說,配置器除了負責配置,也負責回收。爲了方便管理,第二級配置器會主動將任何小額區塊的內存需求量上調至8的倍數。

空間配置函數allocate()

allocate()函數首先會判斷區塊大小,大於128bytes就調用第一級配置器,小於128bytes就檢查對應的free list。如果free list之內有可用的區塊,就直接拿來用,如果沒有可用的區塊,就將區塊大小上調至8倍數邊界,然後調用refill()函數,準備爲free list重新填充空間。

空間釋放函數deallocate()

該函數首先判斷區塊大小,大於128bytes就調用第一級配置器,小於128bytes就找出對應的free list,將區塊回收。

參考《STL源碼分析》

謝謝閱讀。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章