《STL原始碼剖析》STL的雙層配置器

2021-07-29 22:59:41 字數 1490 閱讀 7611

sgi stl第一級配置器:

templateclass __malloc_alloc_template;

其中:1.allocate()直接使用malloc(),deallocate()直接使用free().

2.模擬c++的set_new_handler()以處理記憶體不足的情況.

sgi stl第二級配置器:

templateclass _default_alloc_template;

其中:1.維護16個自由鍊錶(free lists),負責16種小型區塊的次配置能力.

記憶體池以malloca()配置而得.如果記憶體不足,專用第一級配置器(那兒有處理程式)

2.如果需求區塊大於128bytes,就轉呼叫第一級配置器.

不管使用的是第一級配置器還是第二級配置器,都是用malloc()實現的。

第一級配置器以malloc(),free(),realloc()等c函式執行實際的記憶體配置和釋放,衝配置操作,並實現出累死c++ newhandler的機制,是的,它不能直接運用c++new-handler機制,因為它並非 使用::operator new來配置記憶體。(所謂c++new handler機制是,你可以要求系統在記憶體配置需求無法被滿足時,呼叫乙個你所指定的函式)

sgi第一季配置器的allocate()和realloc()都是在呼叫malloc()和realloc()不成功後,改呼叫oom_malloc()和oom_realloc(),後兩者都有內迴圈,不斷呼叫「記憶體不足處理例程」,期望在某次呼叫後,獲得足夠的記憶體而圓滿完成任務,但如果「記憶體不足例程」未被客端設定,oom_malloc()和oom_realloc()便老實不客氣地呼叫_throw_bad_alloc,丟出bad_alloc異常資訊,或者利用exit(1)中止程式。

sgi第二級配置器的做法是,如果區塊夠大,超過128bytes時,就移交第一級配置器處理,當區塊小玉128bytes時,則以記憶體池(memory pool)管理,此法又成為次層配置:每配置一大塊記憶體,並維護對應之自由鍊錶。下次若再有相同大小的記憶體需求,就直接從free-lists中取出,如果客端釋還小額區塊,就由配置器**到自由鍊錶中,為了方便管理,sgi第二級配置器會主動將任何小額區塊的記憶體需求量上公升至8的倍數(例如客端要求30bytes,就自動調整為32bytes),並維護16個free-lists,各自管理大小分別為8,16,24,32,40,48,56,64。。。128bytes的小額區塊,自由鍊錶的結點結構如下:

union obj;//使用union節省記憶體
身為乙個配置器,_default_alloc_template擁有配置器的標準介面函式allocate(),此函式首先判斷區塊的大小,大於128bytes就呼叫第一級配置器,小玉128bytes就檢查對應的自由鍊錶,如果沒有可用的區塊,就將區塊大小上調至8的倍數邊界,然後呼叫refill()準備為free list重新填充空間。

STL原始碼剖析

這兩天略讀完了 stl原始碼剖析 之所以是略讀,就是只看大體,不講具現 這個詞在 深度探析c 物件模型 中比較多 已經看過好幾本c 的書了,感覺c 本身設計的博大精深,而c 編譯器就更是乙個神奇的東西,換句話說,你永遠不知道c 編譯器揹著你做了哪些出乎你意料的事 不扯遠了 我主要是想看stl容器的具...

STL原始碼剖析

這兩天略讀完了 stl原始碼剖析 之所以是略讀,就是只看大體,不講具現 這個詞在 深度探析c 物件模型 中比較多 已經看過好幾本c 的書了,感覺c 本身設計的博大精深,而c 編譯器就更是乙個神奇的東西,換句話說,你永遠不知道c 編譯器揹著你做了哪些出乎你意料的事 不扯遠了 我主要是想看stl容器的具...

STL原始碼剖析

花了兩天時間略讀了一下 stl原始碼分析 看了個大體,對於細節並沒有深究。之所以想翻翻這本書,主要是想看看stl中的特性 介面卡的具體實現。看完之後收穫還是蠻大的,模板的各種組合讓我眼前一亮,下面大概總結一些內容。1.記憶體分配 sgi記憶體分配採用兩級實現,對於大記憶體塊的申請 大於128k 由第...