STL學習筆記 三 空間配置器

2021-07-04 14:07:41 字數 1773 閱讀 7632

我們首先來看一下stl空間配置器中的第一級和第二級配置器:

_malloc_alloc_template直接使用c語言中的malloc、free和realloc進行申請、釋放和重新申請的操作,並且在記憶體空間不足情況下模擬c++的set_new_handler()。

什麼是set_new_handler機制?

當記憶體空間不足的情況下,不是直接丟擲 bad_alloc,而是先執行乙個處理的涵式,這個涵式就是set_new_handler。這個機制下,有機會釋放其他的記憶體來給當前申請使用。如果失敗了才會繼續執行丟擲 bad_alloc的操作。

為什麼不能直接使用c++的set_new_handler?

因為sgi的stl中配置空間使用的是malloc並非採用new,所以就不能使用c++裡面的set_new_handler機制。

__default_alloc_template擁有乙個配置涵式:allocate()。allocated首先判斷申請空間的大小,如果大於128bytes就呼叫第一級配置器,如果小於128bytes就檢查對應的 free_list。如果 free_list 之內有可用的塊兒就直接用,如果沒有可用的塊兒就將區塊兒上調至8的倍數,然後呼叫refill(),準備為 free_list 重新填充空間。

第二級配置器維護 16 個 free_lists,各自管理大小分別為 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, 128 bytes。(都是8的倍數)

union obj ;
記憶池用來給 free_list 提供塊兒。這些工作是由chunk_alloc()函式完成的,並且如果記憶池水量充足時,都是一次拿出20塊兒大小,除了給客戶使用的,剩下的都放在free_list中。

注意:當記憶池為空的時候,如果 free_list 繼續像記憶池申請空間,那麼記憶池會申請兩倍的空間大小,並將其中一半給 free_list,另一半存在記憶池中。(所以初次申請空間的時候一定是申請兩倍的,因為記憶池初始為空)

我們舉例說明記憶池的工作方式:

程式一開始,客戶申請32位元組大小的空間,此時free_list[3]為空,呼叫 chunk_alloc(32, 20),於是記憶池malloc了40個32bytes的區塊兒,其中第乙個交出,另19個交給free_list[3]維護,剩下的20個留在記憶池中。接下來客戶呼叫chunk_alloc(64, 20),free_list[7]為空,請求記憶池,而記憶池只能提供10個塊兒(32*20/64=10)。第乙個給客戶,另9個給free_list[7]維護,記憶池為空。如果接下來繼續chunk_alloc(96, 20),此時free_list[11]為空,記憶池也為空,於是記憶池malloc了40+n(附加量)個96bytes的區塊,第乙個交出,另19個給free_list[11]維護,剩餘20+n存在記憶池中。

注意:如果整個系統的heap空間都不夠了,那麼記憶池的malloc操作就會失敗,chunk_alloc就會到處尋找有沒有空閒的free_list,如果有交出,如果沒有呼叫第一級配置器,第一級配置器也是使用malloc,但是第一級配置器有 out_of_memory機制(模擬c++的new_handler機制),這個機制有機會釋放其他記憶體來使用,如果可以則成功,否則丟擲bad_alloc異常。

STL 空間配置器

stl有6大元件 容器 演算法 迭代器 仿函式 配接器 分配器。它們之間的密切關係是stl的精髓所在,容器用來存放資料,而容器存在的前提是要有分配器給它分配記憶體,接下來需要實現演算法,迭代器便作為演算法來對容器資料操作的橋梁,演算法可以使用仿函式完成不同的策略變化,配接器可修飾或套接仿函式。說了麼...

STL 空間配置器

stl空間配置器的底層原理 維護了乙個狹義的記憶體池,並且用乙個自由鍊錶來維護該記憶體池。該自由鍊錶比較類似於雜湊的開鏈法的儲存結構。源 pragma once using namespace std define throw bad alloc cerr out of memory endl ex...

STL空間配置器

一級空間配置器 ifndef malloc alloc template h define malloc alloc template h if 0 include define throw bad alloc throw bad alloc elif defined throw bad alloc...