stl空間配置器的底層原理:
維護了乙個狹義的記憶體池,並且用乙個自由鍊錶來維護該記憶體池。該自由鍊錶比較類似於雜湊的開鏈法的儲存結構。
源**:
#pragma once
using namespace std;
#define __throw_bad_alloc cerr << "out of memory" << endl; exit(1)
typedef void*(*func_ptr)();
template class __mallocalloctemplate //一級空間配置器
return result;
} static void deallocate(void* p)
static void* reallocate(void* p, size_t n)//n代表新的空間大小
return result;
} static func_ptr setmallochandler(func_ptr f) //static void (* setmallochandler(void (*f)()))()
private:
//函式宣告
static void* oommalloc(size_t);
static void* oomrealloc(void *, size_t);
//靜態成員變數
static func_ptr __mallocallocoomhandler;
};//靜態變數的初始化
templatefunc_ptr __mallocalloctemplate::__mallocallocoomhandler = 0;
templatevoid* __mallocalloctemplate::oommalloc(size_t n)
}templatevoid* __mallocalloctemplate::oomrealloc(void* p, size_t)
}typedef __mallocalloctemplate<0> mallocalloc;
template //二級空間配置器
class __defaultalloctemplate
myfreelist = _freelist + freelist_index(n);
result = *myfreelist;
if (result == null)//代表該位置還沒掛有空閒的空間,然後去申請
else
}static void deallocate(void* p, size_t n)
myfreelist = _freelist + freelist_index(n);
//頭插
((obj*)p)->_freelistlink = *myfreelist;
*myfreelist = (obj*)p;
}private:
static size_t round_up(size_t bytes) //8位元組向上對齊
static size_t freelist_index(size_t bytes)//定位
private:
//變數
enum ; //預設最小的記憶體塊是8個位元組
enum ;//預設最大的記憶體塊是128個位元組
enum ;//自由鍊錶的個數
union obj
; static char* _startfree; //記憶體池的頭指標
static char* _endfree; //記憶體池的頭尾指標
static size_t _heapsize; //記憶體池總共有多少空間
static obj* _freelist; //指標陣列(自由鍊錶的指標陣列)
//函式
static void* _refill(size_t n); //對大塊記憶體進行分割並且掛在自由鍊錶下
static char* _chunkalloc(size_t size, int &nobjs);//開闢大塊記憶體
};template char* __defaultalloctemplate::_startfree = null;
template char* __defaultalloctemplate::_endfree= null;
template size_t __defaultalloctemplate::_heapsize = 0;
template typename __defaultalloctemplate::obj* __defaultalloctemplate::_freelist = ;
//此處加typename是因為obj是類中的乙個型別,要找到它必須先找到__defaultalloctemplate,
//如果不加typename編譯器將無法找到__defaultalloctemplate這個型別中的obj型別
//其目的是為了申明__defaultalloctemplate是乙個型別
//填充自由鍊錶
template void* __defaultalloctemplate::_refill(size_t n) //將分配好的大塊記憶體的第乙個返回,將剩下的掛起來
next->_freelistlink = null;
return result;
}//進行記憶體塊的分配
template char* __defaultalloctemplate::_chunkalloc(size_t size, int &nobjs) //分配大塊記憶體
else if (bytesleft >= size)//剩餘的空間不夠20個,但是夠1個以上
else //剩餘的空間還不夠乙個size
//申請空間
size_t bytestoget = totelbytes * 2 + round_up(_heapsize / 16); //計算新申請空間的大小
_startfree = (char*)malloc(bytestoget); //申請空間
//申請空間失敗,去自由鍊錶裡邊找更大的記憶體
if (_startfree == 0)
}//山窮水盡
_endfree = 0;
_startfree = (char*)mallocalloc::allocate(bytestoget); //如果還失敗,_startfree接受乙個值為0
} //空間申請成功
_heapsize += bytestoget;
_endfree = _startfree + bytestoget;
return _chunkalloc(size, nobjs); }}
#ifdef __use_malloc
typedef mallocalloc alloc;
#else
typedef __defaultalloctemplatealloc;
#endif //__use_malloc
templateclass ******alloc
static t* allocate(void)
static void deallocate(t* p, size_t size) }
static void deallocate(t *p) };
#includeusing namespace std;
void test()
v.push_back(sa.allocate());
}
STL 空間配置器
stl有6大元件 容器 演算法 迭代器 仿函式 配接器 分配器。它們之間的密切關係是stl的精髓所在,容器用來存放資料,而容器存在的前提是要有分配器給它分配記憶體,接下來需要實現演算法,迭代器便作為演算法來對容器資料操作的橋梁,演算法可以使用仿函式完成不同的策略變化,配接器可修飾或套接仿函式。說了麼...
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...
STL 空間配置器
stl的記憶體分配和釋放被詳細區分為四個部分 記憶體配置由allocate 負責 內部實現為operator new 記憶體釋放由deallocate 負責 內部實現為operator delete 物件構造由construct 負責 內部實現為placement new 物件析構操作由destro...