sgi stl有兩級配置器:
以下**為簡單實現:
第一級配置器標頭檔案:malloc_alloc.h
#ifndef malloc_alloc_h
#define malloc_alloc_h
#include
class malloc_alloc
static
void deallocate(void* p, size_t n)
static
void* reallocate(void* p, size_t old_sz, size_t new_sz)
};#endif
第一級配置器標頭檔案:malloc_alloc.cpp
#include"malloc_alloc.h"
#include
void* malloc_alloc::oom_malloc(size_t n)
std::cout
<< "malloc error!"
<< std::endl;
return0;}
void* malloc_alloc::oom_realloc(void* p, size_t n)
std::cout
<< "realloc error!"
<< std::endl;
return
0;}
第二級配置器標頭檔案:memorypool.h
#ifndef _memorypool_h
#define _memorypool_h
#include
using
namespace
std;
enum ; //小型區塊的上調邊界
enum ; //小型區塊的上限
enum ; //freelists個數
//記憶體池
class alloc;
private:
//16個freelists
static obj* volatile free_list[numfreelists];
//以下函式根據區塊的大小,決定使用第n號free_list,n從0開始
static size_t freelist_index(size_t bytes)
//將bytes上調至8的倍數
static size_t round_up(size_t bytes)
//返回乙個大小為n的物件,並可能加入大小為n的其他區塊到free_list
static
void* refill(size_t n);
//配置一大塊區間,可容納nobjs個大小為size的區塊,如果修飾nobjs個區塊無法滿足,
//nobjs可能會降低
static
char* chunk_alloc(size_t size, int& nobjs);
//區塊的狀態
static
char* start_free; //記憶體池的起始位址
static
char* end_free; //記憶體池的結束位址
static size_t heap_size;
public:
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); //重新分配記憶體
};#endif
第二級配置器標頭檔案:alloc.cpp
#include"malloc_alloc.h"
#include"memorypool.h"
//static成員的初值設定
char* alloc::start_free = null;
char* alloc::end_free = null;
size_t alloc::heap_size = 0;
alloc::obj* volatile alloc::free_list[numfreelists] = ;
//分配記憶體
void* alloc::allocate(size_t n)
//調整free_list
*my_free_list = result->free_list_link;
return result;
}//釋放記憶體
void alloc::deallocate(void* p, size_t n)
//尋找對應的區塊
my_free_list = free_list + freelist_index(n);
q->free_list_link = *my_free_list;
*my_free_list = q;
}//返回乙個大小為n的物件,並且有時候會為適當的free_list增加節點,假設n已經適當上調至8的倍數
void* alloc::refill(size_t n)
else
}return result;
}//記憶體池配置記憶體
//呼叫chunk_alloc(),嘗試取得nobjs個區塊作為free_list的新節點
//注意引數nobjs是pass by reference
char* alloc::chunk_alloc(size_t size, int& nobjs)
else
if (bytes_left >= size)
else
//配置heap空間,用來補充記憶體池
start_free = (char*)malloc(bytes_to_get);
if (start_free == 0)
}end_free = 0;
start_free = (char*)malloc_alloc::allocate(bytes_to_get);
}heap_size += bytes_to_get;
end_free = start_free + bytes_to_get;
//遞迴呼叫自己,為了修正nobjs
return (chunk_alloc(size, nobjs));
}}
測試檔案:main.cpp
#include"memorypool.h"
#include
int main()
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...