STL原始碼剖析 記憶體配置和釋放

2021-08-20 21:32:01 字數 1898 閱讀 5345

其中__malloc_alloc_template<>

public:

static void * allocate(size_t n) //

直到分配成功返回或拋異常,呼叫

oom_malloc

static void deallocate(void *p, size_t /* n */)

static void * reallocate(void *p, size_t /* old_sz */, size_t new_sz) //

直到分配成功返回或拋異常,呼叫

oom_realloc

// 模擬c++

標準的std::set_new_handle

全域性函式設定記憶體分配失敗後的處理例程

static void (* set_malloc_handler(void (*f)()))()

private:

static void *oom_malloc(size_t);

static void *oom_realloc(void *, size_t);

討論:template

class__malloc_alloc_template

sgi為什麼要用這個模板呢

, 可不可以不用模板

, 直接把這個類定義成普通類呢?

(網友答案)inst這裡僅僅只是為了定義多個內容相同的class但是class型別不同。

例如xx_template<0>和xx_template<1>完全一樣但是型別不同。

inst可以看成是instantiation或者instance(例項)的縮寫。

為什麼要這樣做呢?沒太讀過sgi**,不知道作者怎麼想的。但是sgi中貌似很多地方都用了inst這種方法來例項多個內容一樣但型別不同的class,不僅僅是mem_allocator這裡。

template

class __default_alloc_template{

static void *refill(size_t n); //

重新填充記憶體鍊錶

static void * allocate(size_t n);

static void deallocate(void *p, size_t n);

static void * reallocate(void *p, size_t old_sz, size_t new_sz);

sgi stl的二級記憶體配置器機制在申請配置空間<128k時啟用,而當申請空間》=128k時,呼叫第一級配置器。

// 模板類擁有配置器的標準介面static void * allocate(size_t n)

static void * allocate(size_t n){

if(n>128)

return malloc_alloc::allocate(n); // 申請空間》=128,交由一級配置器處理

if(從空閒記憶體鍊錶簇挑選最合適記憶體鍊錶,然後拿乙個記憶體塊出來){

// 若煉表中記憶體塊不夠,則需要呼叫

refill()

方法重新填充記憶體鍊錶,具體策略

/* 1.      

先從記憶體池中申請

20個記憶體塊給鍊錶,從中拿出乙個返回給使用者;

2.      

若記憶體池中空間也不夠,則優先檢視內不能從其他空閒記憶體鍊錶中擠出一塊記憶體給使用者;

3.       若2

步仍然不能完成,則從系統的全域性堆區申請

40個記憶體塊,其中

20個劃給記憶體池,

19個分給空閒鍊錶,

1個返回給申請者;

4.      

若全域性堆區空間配置仍然失敗,則則呼叫一級配置器,嘗試使用

out-of-memory

機制處理。

*/ /*將申請的記憶體塊返回給使用者*/

STL原始碼剖析

這兩天略讀完了 stl原始碼剖析 之所以是略讀,就是只看大體,不講具現 這個詞在 深度探析c 物件模型 中比較多 已經看過好幾本c 的書了,感覺c 本身設計的博大精深,而c 編譯器就更是乙個神奇的東西,換句話說,你永遠不知道c 編譯器揹著你做了哪些出乎你意料的事 不扯遠了 我主要是想看stl容器的具...

STL原始碼剖析

這兩天略讀完了 stl原始碼剖析 之所以是略讀,就是只看大體,不講具現 這個詞在 深度探析c 物件模型 中比較多 已經看過好幾本c 的書了,感覺c 本身設計的博大精深,而c 編譯器就更是乙個神奇的東西,換句話說,你永遠不知道c 編譯器揹著你做了哪些出乎你意料的事 不扯遠了 我主要是想看stl容器的具...

STL原始碼剖析

花了兩天時間略讀了一下 stl原始碼分析 看了個大體,對於細節並沒有深究。之所以想翻翻這本書,主要是想看看stl中的特性 介面卡的具體實現。看完之後收穫還是蠻大的,模板的各種組合讓我眼前一亮,下面大概總結一些內容。1.記憶體分配 sgi記憶體分配採用兩級實現,對於大記憶體塊的申請 大於128k 由第...