一、stl記憶體配置器的總體設計結構
1.兩級記憶體配置器:sgi-stl中設計了兩級的記憶體配置器,主要用於不同大小的記憶體分配需求,當需要分配的記憶體大小大於128bytes時,
使用第一級配置器,否則使用第二級配置器;
對於小塊的記憶體的分配使用第二級配置器使用分配與釋放記憶體塊的效率更高,時間複雜度為o(1);
2.兩級配置器的優點:
(1)使用兩級配置器主要是為了避免太多的小塊的記憶體申請導致記憶體空間中的記憶體碎片問題;
(2)使用第二級配置器也可以避免太多小塊記憶體分配導致的記憶體空間浪費問題,因為在申請記憶體塊時記憶體塊的一部分必須記錄該被分配的記憶體塊
的大小,
在第二級配置器中則不需要記錄分配的記憶體塊的大小;
(3)第二級配置器同樣也使小塊的記憶體分配與釋放效率更快,複雜度為o(1),而普通的首次適配、下次適配、最佳適配演算法都無法達到分配與釋
放記憶體塊的時間複雜度都為o(1);
二、第一級配置器
1.功能:第一級配置器支援allocate,reallocate,deallocate,set_malloc_handler功能;
2.與c語言記憶體分配函式的比較:相比c語言中的malloc,realloc,free函式而言,第一級配置器是c語言中記憶體分配函式的一層包裝,其相應的功能分
別呼叫對應的c語言記憶體分配函式;
3.第一級配置器的記憶體分配失敗處理功能:第一級配置器增加了處理記憶體分配失敗的機制,set_malloc_handler函式允許使用者指定乙個函式用於記憶體
分配失敗的處理,
當記憶體分配失敗時第一級配置器會呼叫該函式,如果使用者沒有指定特定的處理函式,則根據實際情況,根據使用者的選擇丟擲記憶體分
配失敗的異常或者在標準錯誤流中列印出錯資訊;
三、第二級配置器
1.第二級配置器的結構:第二級配置器含有乙個記憶體池以及用於管理8的整數倍大小的16個free lists;free lists用來分配小塊的記憶體,記憶體池用來
填充free lists,
使每個free lists含有足夠的小塊記憶體用於分配,當free list沒有足夠的小型的記憶體塊用於分配時,向記憶體塊申請記憶體填充free list;
2.記憶體池:記憶體池實際上是乙個使用malloc分配的乙個足夠大的記憶體塊;
3.free lists:在堆的分配演算法中存在首次適配、下次適配、最佳適配演算法。同樣,堆中記憶體塊的組織方法有隱式空閒鍊錶,顯示空閒鍊錶和分離
鍊錶法,
free lists即為分離鍊錶法,
該方法的優點為分配與釋放記憶體都是o(1)的時間,雖然sgi-stl使用的是普通的分離儲存方法,而不是分離適配方法,這會
導致部分空間的浪費,然而由於記憶體塊的浪費在0-8bytes
之間,相比較而言,對於經常需要較小的記憶體塊分配的程式而言效率的提高更大;
四、sgi-stl記憶體分配演算法流程圖
STL配置器的記憶體分配策略
stl的幾個組成部分 1.容器 各種資料結構 2.演算法 各種常用演算法 3.迭代器 容器與演算法之間的聯合器,泛型指標 4.仿函式 協助演算法完成不同的策略的變化?5.介面卡 修飾或套接仿函式?6.配置器 分配空間管理 配置器的記憶體空間管理策略 一級配置器 對於大於128b的空間,使用一級配置器...
STL的記憶體配置器分配例子
在stl中考慮到小型區塊所可能造成的記憶體破碎問題,sgi stl設計了雙層級配置器,第一級配置器直接使用malloc 和free 第二級配置器則視情況採用不同的策略 當配置區塊超過128bytes時,則視之為足夠大,便呼叫第一級配置器 當配置區塊小於128bytes時,則視之為過小,為了降低額外負...
stl記憶體池剖析空間配置器
原 參考stl庫 具體只有記憶體分配 類似於c 的newhander 部分 沒有列出 stl空間配置器的記憶體池模型 pragma once include include include using namespace std class mallocalloctemplate 定義一級空間配置器...