源**展示:
stl標準的空間配置器 就是將new和delete進行了簡單的封裝,這裡不是重點,就懶得說了。而且這個標準的空間配置器也沒被進行使用。
sgi特殊的空間配置器:
一級配置器的實現:
就是正常的malloc和free,但在此的基礎上新增了乙個事件處理:即針對於malloc返回值為null的情況,系統記憶體開闢失敗的一些處理。
處理失敗的記憶體分配要求的其他方法:編寫自定義恢復例程來處理此類失敗,然後通過呼叫 _set_new_handler 執行時函式來註冊您的函式。/官方解釋 /設定乙個函式控制代碼:系統在記憶體配置需求無法被滿足的情況下,呼叫乙個你所指定的函式,
因為函式的每次呼叫都會消耗記憶體的空間,當函式返回又會釋放記憶體。不斷的進行呼叫,說不定就會有合適的記憶體。(廢話多就知道是本人解釋)
:malloc開闢空間失敗的情況:
typedef
void(*alloc_handler)();//定義乙個函式控制代碼,
二級配置器:
//先列出來一些成員變數
public:
enum;// 基準值
enum; //區塊最大位元組數;
enum; //區塊個數
protected:
union obj //共用體,省空間
;static obj* _freelist[__blocknum]; //存放自由鍊錶的指標陣列
// chunk allocation state.
static
char* _start_free; //大塊的首位址
static
char *_end_free; //大塊的尾位址
static size_t _heap_siz; //附加量,開闢所需大小的記憶體池的時候附加的記憶體空間
最重要的還是二級配置器:而且這也算是 sgi 版本的記憶體池 :
/二級配置器簡單來說就一兩句話:乙個指標陣列存放自由煉表頭指標,自由鍊錶指向對應的記憶體塊,每乙個陣列成員含義是代表記憶體區塊的大小,自由鍊錶指向對應的記憶體塊 /
思路: 1.如果所需區塊《位元組數》過大,超過128 bytes,則呼叫一級空間配置器進行處理.
2.當所需區塊《位元組數》小於128bytes時,則需要求得其所對應的區塊位置。< free_list成員為8的倍數,陣列每個成員代表區塊的大小 >
3.找到對應的位置然後查詢該處是否有剩餘的區塊,若有,則直接從free_list對應的位置中撥出區塊,因為是鍊錶,所以記得要指向下乙個位置。若沒有,則需要呼叫refill(),準備為free_list重新填充區塊,新的空間將取自記憶體池。
4.記憶體池的空間:refill()重新填充給free_list時,要看記憶體池的大小 ,若記憶體池
小於乙個區塊:連乙個所需要的區塊都沒有,就只能進行重新開闢
大於乙個區塊:返回chunk,記憶體池chunk之後的記憶體池經過分割對應的區塊大小之後連在free_list中
等於乙個區塊:直接返回chunk,也不用在free_list中新增區塊,因為其初始值就是null;
5.有申請就會有釋放:當釋放的區塊《位元組數》 大於128bytes時,就呼叫一級空間配置器進行處理,否則就直接連在free_list對應的位置中。《頭插》
上面的一二級配置器只是實現了空間的開闢和釋放,sgi還為它包裝了乙個類 ,使配置器介面能夠符合stl規格:
template
class ******alloc //僅僅只是空間配置器的介面
static t* allocate(size_t n )//多個物件或者陣列,
static
void deallocate(t* ptr,size_t n)
static
void deallocate(t* ptr)
};
其內部函式知識單純的轉呼叫,呼叫傳遞給配置器,這個介面使配置器的配置單位從位元組數轉為個別元素的大小,或者元素的個數。sgi stl容器全部都是用這個******_alloc介面。
STL原始碼剖析 空間配置器
看過stl空間配置器的原始碼,總結一下 1 stl空間配置器 主要分三個檔案實現,stl construct.h 這裡定義了全域性函式construct 和destroy 負責物件的構造和析構。stl alloc.h檔案中定義了 一 二兩級配置器,彼此合作,配置器名為alloc.stl uninit...
STL原始碼剖析 空間配置器
allocator是空間配置器而不是記憶體配置器,空間不一定是記憶體,也可以是磁碟或其他輔助儲存介質。但sgi stl提供的配置器配置的物件是記憶體。sgi標準的空間配置器,std alloctor sgi定義了乙個符合部分標準,名為alloctor的配置器,效率不高,只把c 的 operator ...
STL原始碼剖析 空間配置器
由於物件的建立分為分配記憶體和呼叫建構函式兩部分,stl allocator使用alloc allocate 來分配記憶體,construct 構造物件。construct 函式只有乙個泛化的版本,destroy 函式有乙個泛化的針對迭代器的版本,destroy aux 根據是否需要呼叫析構函式進行...