有關記憶體池的分配本人在此未剖析,還請讀者自行考慮
//一級配置器
template
class _malloc_alloc_one
}static void *deallocate(void *p,size_t)
static void *reallocate(void *p,size_t old_size,size_t new_size)}};
//二級配置器
enum;//小型區塊的上調邊界
enum;//小型區塊的邊界
enum;//個數
template
class alloc
private;
union obj//freelist節點構造
static obj *volatile free_list[_nfreelists];
static size_t freelist_index(size_t bytes)
//返回乙個大小為n的物件,並可能加入大小為n的其他區塊到freelist
static void *refill(size_t n)//配置一大塊空間,客容納大小為size的qukuai
my_free_list=free_list+freelist_index(n);
result =(*obj)chunk;
*my_free_list=next_obj=(obj*)(chunk+n);
for (i=1;;i++)
else
}return (result);
}static char* chunk_alloc(size_t size,int &nobjs)
else if (bytes_left>=size)//記憶體池的剩餘不能滿足需求量,但足夠**乙個以上的區塊
else
//配置heap空間,用來補充記憶體池
start_free=(char *)malloc(byte_to_get);
if (0==start_free)
}end_free=0;//如果出意外了,就呼叫一級配置器
start_free=(char *)malloc_alloc::allocate(byte_to_get);
heap_size+=byte_to_get;
end_free=start_free+byte_to_get;
retrun (chunk_alloc(size,nobjs));}}
}static char *start_free;
static char *end_free;
static size_t heap_size;
public:
static void *allocate(size_t n)//空間配置函式
//尋找16個freelist中適當的乙個
my_free_list =free_list+freelist_index(n);
result=*my_free_list;
if(result==0)//沒找到可用的freelist,準備重新填充新的freelist
//調整freelist
*my_free_list=result->free_list_link;
return (result);
}static void deallocate(void *p,size_t n)//空間釋放函式
}static void *reallocate(void *p,size_t old_size,size_t new_size);
};
STL學習 SGI二級空間配置器原始碼剖析
二級空間配置器 defaule alloc template 如果感覺光看 難以理解,可以看看上篇部落格介紹了二級空間配置器是怎樣進行記憶體分配的。enum 最小申請的空間的大小 enum 能最大申請的空間的大小 sgi第二配置器有16個free lists enum free lists的個數 t...
《STL原始碼剖析》 空間配置器(二)
一。構造和析構基本工具 construct 和 destroy ifndef sgi stl internal construct h define sgi stl internal construct h 欲使用 placement new,需先包含此檔案 include stl begin na...
STL原始碼剖析 空間配置器
看過stl空間配置器的原始碼,總結一下 1 stl空間配置器 主要分三個檔案實現,stl construct.h 這裡定義了全域性函式construct 和destroy 負責物件的構造和析構。stl alloc.h檔案中定義了 一 二兩級配置器,彼此合作,配置器名為alloc.stl uninit...