STL學習 SGI二級空間配置器原始碼剖析

2021-07-11 12:17:07 字數 3208 閱讀 7803

//二級空間配置器 __defaule_alloc_template

如果感覺光看**難以理解,可以看看上篇部落格介紹了二級空間配置器是怎樣進行記憶體分配的。

enum;//最小申請的空間的大小

enum;//能最大申請的空間的大小

//sgi第二配置器有16個free_lists

enum;//free_lists的個數

templateclass __default_alloc_template

private:

//16個free_lists的節點結構

//union能夠實現一物兩用的效果,1.obj可被視為乙個指標,指向相同形式的另一 //個obj。2.obj可被視為乙個指標,指向實際區塊。

union obj;

private:

static obj * volatile free_list[__nfreelists];//16個free_lists

//計算客戶申請的空間的大小在哪個free_lists自由鍊錶

static size_t freelist_index(size_t bytes)

static char *start_free;//記憶體池起始位置

static char *end_free;//記憶體池結束位置

static size_t heap_size;//附加量

private:

static void *refill(size_t n);

static char *chunk_alloc(size_t size, int &nobjs);

public:

//空間配置函式

static void *allocate(size_t n)

//my_free_list這個二級指標指向客戶申請空間大小適合的自由鍊錶free_lists

my_free_list = free_list + freelist_index(n);

//*my_free_list這個指標指向的是相對應的還沒有給客戶端分配的自由鍊錶的起始

//位置

result = *my_free_list;

//沒有找到可用的free_list,準備檢視有沒有可用的記憶體池來填充自由鍊錶

if(0 == result)

//找到可用的自由鍊錶,調整自由鍊錶,讓*my_free_list這個指標指向還沒有給客 //戶分配的自由鍊錶的起始位置,也就是result的下乙個節點的位置

*my_free_list = result->free_list_link;

return result;

}//空間釋放函式

static void deallocate(void *p, size_t n)

//釋放已經給客戶分配出去的p空間,也就是讓p空間重新連線到自由鍊錶上

//也就是先讓p空間的指標指向下個節點也就是自由鍊錶的起始位置,然後讓自由鏈 //表的起始位置重新指向p空間

my_free_list = free_list + freelists_index(n);

q->free_list_link = *my_free_list;

*my_free_list = q;

}};//對__default_alloc_template這個類內的資料成員的定義與初值設定

templatechar *__default_alloc_template::start_free = 0;

templatechar *__default_alloc_template::end_free = 0;

templatesize_t __default_alloc_template::head_size = 0;

//這裡的資料成員free_list,由於free_list的型別obj * volatile是模板型別宣告的

//並且這個函式名也是模板型別內宣告的,所以這裡對free_list的定義與處值的設定

//用兩個模板類__default_alloc_templatetemplate__default_alloc_template::obj * volatile

__default_alloc_template::free_list[__nfreelista]=

;//重新填充函式,當發現自由鍊錶沒有可用區塊了,就呼叫這個函式從記憶體池中找到空間

//重新填充自由鍊錶

templatevoid *__default_alloc_template::refill(size_t n)

my_free_list = free_list + nfreelist_index[n];

result = (obj *)chunk;//這一塊準備返回給客戶

//chunk指向的是新free_list的起始位置,這裡讓*my_free_list指向新配置的

//空間,取自記憶體池

*my_free_list = next_obj = (obj *)(chunk + n);

//將free_list的各個節點用指標串起來,從第乙個開始,因為第零個區塊

//要返回給客戶

for(i = 1; ; ++i)else

}return (result);

}//從記憶體池中取出空間給free_list使用

templatechar *__defaule_alloc_template::chunk_alloc(size_t size, int &nobjs)

//記憶體池剩餘空間不能夠滿足需求量,但是足夠**乙個或乙個以上的區塊

else if(bytes_left >= size)else

//記憶體池一點零頭都沒有了,就配置heap空間

start_free = (char *)malloc(bytes_to_get);

//如果系統的heap空間不足,malloc()失敗

if(0 == start_free)

}//到處沒有記憶體可用則呼叫一級空間配置器

end_free = 0;

start_free = (char *)malloc_alloc::allocate(bytes_to_get);

}heap_size += bytes_to_get;

end_free = start_free + bytes_to_get;

//遞迴呼叫自己為了修正nobjs

return chunk_alloc(size,nobjs);

}}

STL二級空間配置器

stl的二級空間配置器類似於memory pool,但是並不是memory pool,因為stl的二級空間配置器只維護了16個free list,而且只是小於128byte大小的小區塊,大於128byte會呼叫一級空間配置器malloc。16個鍊錶放在陣列中,每乙個陣列所鏈的鍊錶代表大小相等的小區塊...

STL 一級 二級空間配置器

內碎片 需要3位元組,系統分配4位元組,剩下的1位元組就是內碎片 外碎片 由於不斷申請記憶體和歸還記憶體使得記憶體中剩下很多小片段的記憶體,無法被利用 作用 1 提高 復用率,功能模組化。2 減少記憶體碎片問題。3 提高記憶體分配的效率。4 有記憶體不足時的應對措施。5 隱藏實際中對儲存空間的分配及...

SGI特殊空間配置器std alloc

alloc不接受任何template型別引數,它只是乙個別名。另外,new物件操作實際執行兩個過程 1 呼叫 operator new 配置記憶體。2 呼叫相應的建構函式,構造物件。delete物件也執行兩個過程 1 呼叫相應的析構函式,析構物件。2 呼叫 operator delete 釋放記憶體...