1 標(biāo)準(zhǔn)接口
張老師在課上講述了C++內(nèi)存分配器的標(biāo)準(zhǔn)接口崎坊,接口規(guī)格如下:
- 一組typedef:
-allocator::value_type
-allocator::pointer
-allocator::const_pointer
-allocator::reference
-allocator::const_reference
-allocator::size_type
-allocator::difference_type - allocator::rebind allocator的內(nèi)嵌模板备禀,需要定義other成員
- allocator::allocator() 構(gòu)造函數(shù)
- allocator::allocator(const allocator&) 拷貝構(gòu)造函數(shù)
- allocator::~allocator() 析構(gòu)函數(shù)
- pointer allocator::address(reference x)const 返回對(duì)象地址
- pointer allocator::allocate(size_type n, const void *=0) 分配空間
- void allocator::deallocator(pointer p, size_type n) 釋放空間
- size_type allocator::max_size() const 可以分配的最大空間
- void allocator::construct(pointer p, const T&x) 構(gòu)造分配內(nèi)存中的對(duì)象
- void allocator::destroy(pointer p) 析構(gòu)內(nèi)存對(duì)象
2 用法
allocator的用法有兩種:
第一種是直接使用allocator來分配內(nèi)存并管理內(nèi)存.
allocator<int> alloc;
int *p = alloc.allocate(2); //分配足夠存放2個(gè)Int數(shù)據(jù)的空間
int *free_space = p;
alloc.construct(free_space, 1); //構(gòu)造分配空間內(nèi)對(duì)象,使用allocate分配的空間必須使用construct來構(gòu)造對(duì)象
free_space++;
alloc.construct(free_space, 2);
alloc.deallocate(p, 2); //釋放空間
第二種是通過容器使用allocator奈揍。
vector<int, std::allocator> vec;
vec.push_back(1);
一般情況下曲尸,都是在容器中使用內(nèi)存分配器,不推薦直接使用allocator男翰。如果遇到需要使用內(nèi)存分配的情況另患,可以使用new/delete代替。
3 分配器實(shí)現(xiàn)
GUN C++除了標(biāo)準(zhǔn)庫(kù)使用的std::allocator內(nèi)存分配器外蛾绎,還實(shí)現(xiàn)了以下分配器昆箕。
bitmap_allocator 使用位來表示內(nèi)存是否使用的分配器
debug_allocator 加入調(diào)試信息的分配器
malloc_allocator 簡(jiǎn)單地封裝了malloc和free函數(shù)
new_allocator 對(duì)new/delete函數(shù)進(jìn)行封裝
pool_allcator 基于內(nèi)存池的實(shí)現(xiàn)
throw_allocator 用于異常
mt_allocator 對(duì)多線程環(huán)境進(jìn)行了優(yōu)化
上述分配器的實(shí)現(xiàn)都在GNU的ext目錄下,使用范例如下:
#include <ext/bitmap_allocator.h>
vector<int, __gnu_cxx::bitmap_allocator> vec;