STL原始碼 特殊的空間配置器

2021-07-25 09:07:10 字數 2551 閱讀 1129

源**展示:

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 根據是否需要呼叫析構函式進行...