STL——空间配置器

1,为什么需要空间配置器?

内存碎片:

 STL -空间配置器

比如,系统依次分配了16日8,16日4 8字节,还剩一个8字节未分配,这时要分配一个24字节的空间,系统回收两个16字节,总的空间剩余40字节,但是却分配不出来一个24字节。

二级空间配置器是为频繁分配小内存而生的一种算法,其实就是消除一级空间配置器的外碎片问题


2,一级空间配置器和二级空间配置器

 STL -空间配置器

如果申请的内存大小超过128,那么空间配置器就自动调用一级空间配置器。反之调用二级空间配置器。而且在这里要说明的是空间配置器默认使用的是一级空间配置器。

,,,,一级空间配置器是malloc-free的封装,实现类似c++中新的处理程序机制:一旦申请空间不成功,在丢出bad-allloc异常之前,会先调用用户自己指定的处理例程新的处理程序()。

,,,

代码如下:

template
类MallocAllocTemplate
{


公共:
,静态void *分配(size_t大小)

, {
,, void * ret=malloc(大小),
,,如果(0==ret)
,, {
,,, ret=OomMalloc(大小),
,,}
,,返回ret;
,}

,静态真空释放(void * p)
, {
,,自由(p);
,}

,静态void *重新分配(void * p, size_t newsize)
, {
,, void * ret=realloc (p, newsize);
,,如果(ret==0)
,, {
,,, ret=OomRealloc (p, newsize);
,,}
,,返回ret;
,}
私人:
,静态void * OomMalloc (size_t大小),
, {
,, ALLOC_FUN处理程序;
,, void * ret;
,,而(1)
,, {
,,,处理程序=MallocAllocHandler;
,,,如果(0==处理程序)
,,, {
,,,, cout & lt; & lt;“内存溢出”& lt; & lt;endl;
,,,,退出(1),
,,,}

,,,处理程序();
,,, ret=malloc(规模);
,,,如果(ret)
,,, {
,,,,返回(ret);
,,,}
,,}
,}

,静态void * OomRealloc (void * p, size_t newsize)
, {
,, ALLOC_FUN处理程序;
,, void * ret;
,,而(1)
,, {
,,,处理程序=MallocAllocHandler;
,,,如果(0==处理程序)
,,, {
,,,, cout & lt; & lt;“内存溢出”& lt; & lt;endl;
,,,,退出(1),
,,,}

,,,处理程序();
,,, ret=realloc (newsize);
,,,如果(ret)
,,, {
,,,,返回(ret);
,,,}
,,}
,}
,静态孔隙(* SetMallocHandler (void * f ())) ();
, {
,,无效(* tmp) ()=MallocAllocHandler;
,, MallocAllocHandler=f;
,,返回(tmp);
,}
,
};
template
ALLOC_FUN MallocAllocTemplate:: MallocAllocHander=0;


startFree相当于水位线,标志内存池的大小

自由链表中其实是一个大小为16的指针数,组间隔为8的倍数。各自管理大小分别为8、16、24、32岁,40岁,48岁,56岁,64年,72年,80年,88年,96104年,112120128字节的小额区块。在每个下标下挂着一个链表,把同样大小的内存块链接在一起。类似于哈希桶。

代码如下:


template
类DefaultallocTemplate
{
公共:
, enum{对齐=8};
, enum {MAX_BYTES=128};
, enum {FREELISTS=MAX_BYTES/对齐};工会obj
,
, {
,,联盟obj * listLink;
,, char clientData [1];
,},
,静态size_t FreeListIndex (size_t字节)
, {
,,返回((字节+对齐- 1/- 1)对齐;
,}
,静态size_t RoundUpNum (size_t字节)
, {
,,返回(字节+对齐- 1)和~(- 1)对齐;
,}
,静态obj * FreeList [FREELISTS];,
,静态char * startFree;,
,静态char * endFree;,静态size_t heapSize;
,


,静态void *分配(size_t大小)
, {
,,如果大小比;MAX_BYTES)
,, {
,,,返回MallocAllocTemplate::分配(大小),
,,}
,, void * ret=零;
,, size_t指数=FreeListIndex(大小),

,,如果(FreeList[指数])
,, {
,,, obj * ret=FreeList(指数);
,,, FreeList(指数)=ret→listLink;
,,}
,, else ,
,, {
,,,返回补充(RoundUpNum(大小),
,,}
,,返回ret;
,}

,静态void *重新分配(void * p, size_t oldsize, size_t newsize)
, {
,, void * ret=零;
,,如果(oldsize祝辞null

STL——空间配置器