STL內存配置器

1、STL內存配置器的整體設計結構算法

1.兩級內存配置器:SGI-STL中設計了兩級的內存配置器,主要用於不一樣大小的內存分配需求,當須要分配的內存大小大於128bytes時,函數

使用第一級配置器,不然使用第二級配置器;對於小塊的內存的分配使用第二級配置器使用分配與釋放內存塊的效率更高,時間複雜度爲O(1);spa

2.兩級配置器的優勢:設計

(1)使用兩級配置器主要是爲了不太多的小塊的內存申請致使內存空間中的內存碎片問題;blog

(2)使用第二級配置器也能夠避免太多小塊內存分配致使的內存空間浪費問題,由於在申請內存塊時內存塊的一部分必須記錄該被分配的內存塊內存

         的大小,在第二級配置器中則不須要記錄分配的內存塊的大小;效率

(3)第二級配置器一樣也使小塊的內存分配與釋放效率更快,複雜度爲O(1),而普通的首次適配、下次適配、最佳適配算法都沒法達到分配與釋配置

        放內存塊的時間複雜度都爲O(1);程序

 

2、第一級配置器方法

1.功能:第一級配置器支持allocate,reallocate,deallocate,set_malloc_handler功能;

2.與C語言內存分配函數的比較:相比C語言中的malloc,realloc,free函數而言,第一級配置器是C語言中內存分配函數的一層包裝,其相應的功能分

別調用對應的C語言內存分配函數;

3.第一級配置器的內存分配失敗處理功能:第一級配置器增長了處理內存分配失敗的機制,set_malloc_handler函數容許用戶指定一個函數用於內存

分配失敗的處理,當內存分配失敗時第一級配置器會調用該函數,若是用戶沒有指定特定的處理函數,則根據實際狀況,根據用戶的選擇拋出內存分

配失敗的異常或者在標準錯誤流中打印出錯信息;

 

3、第二級配置器

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之間,相比較而言,對於常常須要較小的內存塊分配的程序而言效率的提升更大;

 

4、SGI-STL內存分配算法流程圖

 

相關文章
相關標籤/搜索