STL 空間配置器

2021-07-29 15:25:57 字數 3725 閱讀 1551

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...