stl的二級空間配置器類似於memory_pool,但是並不是memory_pool,因為stl的二級空間配置器只維護了16個free_list,而且只是小於128byte大小的小區塊,大於128byte會呼叫一級空間配置器malloc。16個鍊錶放在陣列中,每乙個陣列所鏈的鍊錶代表大小相等的小區塊,因為分配的時候,只會申請8的倍數大小的空間,所以小於128byte的區塊肯定是屬於free_list裡面。當小區塊釋放時,就會掛到free_list中。
下面是二級空間配置器的原始碼:
_align = 8,表示最小的小區塊的大小_max_bytes = 128 表示最大的區塊的大小
_nfreelists = 16 表示free_list的個數
#if ! (defined(__sunpro_cc) || defined(__gnuc__))
enum ;
enum ;
enum ; // _max_bytes/_align
# endif
這是將申請的大小按8位元組對齊:
static size_t
_s_round_up(size_t __bytes)
這是free_list的node結構體:
__private:
union _obj ;
free_list的定義:
# if defined(__sunpro_cc) || defined(__gnuc__) || defined(__hp_acc)
static _obj* __stl_volatile _s_free_list;
// specifying a size results in duplicate def for 4.1
# else
static _obj* __stl_volatile _s_free_list[_nfreelists]; //volatile 是為了防止在多執行緒下產生不可預期的後果
# endif
static char* _s_start_free; //記憶體池中未分給free_pool的首位址
static char* _s_end_free; //記憶體池的末尾位址
static size_t _s_heap_size;//記憶體池的總空間大小
二級空間配置器分配函式:
static void* allocate(size_t __n)
else
}return __ret;
};
下面的函式是從一級空間配置器(malloc)申請小塊記憶體的函式:
template void*
__default_alloc_template<__threads, __inst>::_s_refill(size_t __n)
else
}return(__result);
}
_s_chunk_alloc:
template char*
__default_alloc_template<__threads, __inst>::_s_chunk_alloc(size_t __size, int& __nobjs)
else if (__bytes_left >= __size) else
/*記憶體池剩餘為0時,malloc乙個小塊記憶體,進行分配*/
_s_start_free = (char*)malloc(__bytes_to_get);
if (0 == _s_start_free)
}//將申請的空間分配完之後,再申請一塊記憶體池空間作為備用
_s_end_free = 0;
_s_start_free = (char*)malloc_alloc::allocate(__bytes_to_get);
}/*如果不是第一次申請記憶體池空間,把記憶體池的大小擴大,再呼叫自己進行空間分配*/
_s_heap_size += __bytes_to_get;
_s_end_free = _s_start_free + __bytes_to_get;
return(_s_chunk_alloc(__size, __nobjs));
}}
這就是整個stl庫中的二級空間配置器的流程,其實也在模仿ptmalloc的記憶體管理機制,使用記憶體池和空間**,避免多次庫函式呼叫或者系統呼叫,大大節省了程式執行的時間。這裡的二級空間配置器只要用到了free_list和小塊記憶體池,雙層保證小塊空間分配的速率比直接malloc快。但是在實戰中的效率對比還是需要實踐才能得出結論。 STL 一級 二級空間配置器
內碎片 需要3位元組,系統分配4位元組,剩下的1位元組就是內碎片 外碎片 由於不斷申請記憶體和歸還記憶體使得記憶體中剩下很多小片段的記憶體,無法被利用 作用 1 提高 復用率,功能模組化。2 減少記憶體碎片問題。3 提高記憶體分配的效率。4 有記憶體不足時的應對措施。5 隱藏實際中對儲存空間的分配及...
STL學習 SGI二級空間配置器原始碼剖析
二級空間配置器 defaule alloc template 如果感覺光看 難以理解,可以看看上篇部落格介紹了二級空間配置器是怎樣進行記憶體分配的。enum 最小申請的空間的大小 enum 能最大申請的空間的大小 sgi第二配置器有16個free lists enum free lists的個數 t...
STL 空間配置器二 第一級配置器
慮到小型區塊可能造成的記憶體破碎問題,sgi 為此設計了雙層級配置器。當配置區塊超過 128bytes 時,稱為足夠大,使用第一級配置器,直接使用 malloc 和 free 當配置區塊不大於 128bytes 時,為了降低額外負擔,直接使用第二級配置器,採用複雜的 memory pool 處理方式...