STL空間配置器 兩級空間配置器簡介

2021-10-12 04:04:35 字數 2319 閱讀 4411

本篇主要是簡單介紹一下兩級空間配置器的思路,以及提前說一下new_handler機制

sgi 設計了雙層級配置器,第一級配置器直接使用 malloc() 和 free(),第二級則視情況採用不同策略,並採用了複雜的記憶體池(memory pool) 整理方式。

alloc是我們使用的配置器.

alloc可能被指定為1級空間配置器

也可能被指定為二級空間配置器

alloc的指定

//我們可以指定alloc是幾級空間配置器

#ifdef _use_malloc..

.typedef __malloc_alloc_template<

0> malloc_alloc;

typedef malloc_alloc alloc;

// 令alloc為第一級配置器

#else..

.// 令alloc為第二級配置器

typedef __default_alloc_template<__node_allocator_threads>

0> alloc;

#endif

/* ! _use_malloc*/

從上述**可以看出 我們使用的alloc是二級或者一級空間配置器的乙個新的名字~

無論alloc具體是幾級空間配置器,我們都會對他進行進一步的再度封裝

template

<

classt,

class

alloc

>

class

******_alloc

static t *

allocate

(void

)//釋放空間

static t *

deallocate

(t *p, size_t n)

static t *

allocate

(size_t n)

};

當配置區塊超過128bytes時,將使用一級空間配置器

一級空間配置器要點

allocate() 直接使用 malloc(),deallocate()直接使用free()

一級空間配置器內部模擬實現了set_new_handler機制

當配置區塊小於128btyes時,選擇二級空間配置器

二級級空間配置器要點

維護了16個自由鍊錶,負責16種小型區塊的次配置能力

使用記憶體池分配記憶體,如果記憶體池記憶體不足,就轉呼叫一級空間配置器

如果需求的快去大於128bytes就呼叫一級空間配置器

一級空間配置器要求

基本上就是對4個轉調函式使用malloc 和free 封裝

考慮malloc失敗的情況,------>實現new_handler機制

注意丟擲的異常機制

維護乙個類似於hash桶的free_list陣列. 每個陣列分別管理不同大小的記憶體塊區

需要對使用者申請的空間進行邊界調整

需要乙個hash函式,來確定申請記憶體從哪個free_list取出

知道了從那個free_list裡面去自由節點,的話,就去**找

如果對應的free_list鍊錶裡面有自由節點,---->萬事大吉,分配出去就好了

如果對應的free_list鍊錶裡面沒有空閒的自由節點的話,就需要去想記憶體池申請

向記憶體池申請有多重可能

想記憶體池申請空間,會預設的申請20個該型別大小的節點

如果記憶體池供大於求---->則直接分配

如果記憶體池供不應求,但是有乙個以上,----->則將nobjs=byte_left/size 盡可能返回多個節點

如果記憶體池連乙個都無法分配,則會通過malloc從堆上申請

malloc可能會失敗!

如果malloc成功,則會將新申請的記憶體併入到記憶體池中去,然後遞迴的申請

2.如果malloc 失敗,則首先要將則先將手上的自由鍊錶陣列(hash桶)從頭到尾遍歷一遍,把所有的空閒節點,全都拿出來,然後從新分配,看看能不能從這些小碎片中拿出來.

3.然後轉調一級空間分配器,看看oom能不能 起點作用

STL 空間配置器

stl有6大元件 容器 演算法 迭代器 仿函式 配接器 分配器。它們之間的密切關係是stl的精髓所在,容器用來存放資料,而容器存在的前提是要有分配器給它分配記憶體,接下來需要實現演算法,迭代器便作為演算法來對容器資料操作的橋梁,演算法可以使用仿函式完成不同的策略變化,配接器可修飾或套接仿函式。說了麼...

STL 空間配置器

stl空間配置器的底層原理 維護了乙個狹義的記憶體池,並且用乙個自由鍊錶來維護該記憶體池。該自由鍊錶比較類似於雜湊的開鏈法的儲存結構。源 pragma once using namespace std define throw bad alloc cerr out of memory endl ex...

STL空間配置器

一級空間配置器 ifndef malloc alloc template h define malloc alloc template h if 0 include define throw bad alloc throw bad alloc elif defined throw bad alloc...