STL記憶體分配

2021-08-18 20:27:27 字數 1072 閱讀 5330

stl記憶體分配

由於小型的記憶體區塊會因此記憶體分配碎片,sgi stl設計中使用了雙層級配置器第一級配置器直接使用malloc()和free(),申請記憶體大於128位元組時呼叫;第二級配置器採用記憶體池的方式來管理。

stl記憶體分配器在檔案中實現,__malloc_alloc_template__default_alloc_template,分配器都需要實現兩個介面allocate和deallocate。本文主要討論第二級的分配器的實現。

__default_alloc_template:stl預設小記憶體分配器

分配器的實現

維護了16個free list,每個list上集合著大小分別為8,16,24,…128大小的記憶體塊。如果請求的記憶體塊大小大於128bytes,就轉呼叫第一級配置器。使用了鍊錶結構管理記憶體塊:

union obj
相當於每個塊前面4個位元組用來儲存節點頭結構,結構體中client_data返回的實際上可用的記憶體塊位址。free_list中找到合適的塊後,會將下乙個空閒塊的位址寫在原來這個free_list陣列元素的位置。一般而言記憶體塊是連續的。

記憶體申請流程:

大於128位元組,使用第一級配置器向系統申請,malloc不成功會呼叫set_new_handler來處理異常。

小於128位元組,使用第二級介面卡。如果有對應大小的free_list記憶體塊,正常返回;如果free_list沒有:

如果2.2失敗,會求助於第一級配置器,主要是想借助於第一級配置器裡的異常處理,例如out_of_memory中申請到一點記憶體。如果這一步也失敗,那麼就是徹底失敗了。

釋放器stl中呼叫deallocate後,對於小塊記憶體,會放入到free_list中而不是釋放回系統。

STL的記憶體分配器

題記 記憶體管理一直是c c 程式的 關於記憶體管理的話題,大致有兩類側重點,一類是記憶體的正確使用,例如c 中new和delete應該成對出現,用raii技巧管理記憶體資源,auto ptr等方面,很多c c 書籍中都使用技巧的介紹。另一類是記憶體管理的實現,如linux核心的slab分配器,st...

STL的記憶體分配器

分類 c c stl 2011 04 04 18 34 1689人閱讀收藏 舉報list 演算法vector linux核心 byte raii 題記 記憶體管理一直是c c 程式的 關於記憶體管理的話題,大致有兩類側重點,一類是記憶體的正確使用,例如c 中new和delete應該成對出現,用rai...

STL記憶體分配器 allocator

一 stl泛型容器 與 記憶體管理 1.1 stl泛型容器中隱藏了記憶體管理工作 stl提供了很多泛型容器,如vector,list,map等。程式設計師使用時之關心如何存放物件,不用關心如何管理記憶體。容器會根據需要自動增長記憶體,在退出其作用域時,也會自動銷毀占有的記憶體。stl容器巧妙的避開了...