Allocator空间分配器一
一 简介
Allocator分配器是STL的重要组件,负责为容器Container中的元素分配和释放空间,前面也说过将Allocator独立出来的好处就是可以实现不同的分配策略,因而可以根据需要使分配尽可能的最优化;而且这也使定制自己的分配器成为可能。
Allocator分配的空间不一定就是内存,你可以从任何可行的地方分配内存,比如磁盘。
二 Allocator的标准接口
为了给各种Container提供空间分配/释放的能力,Allocator必须具有一组标准的接口,直接照搬列出了,全部死记这些对能力也不会有什么提高,重要的是能够自己根据需要实现一个Allocator就行了。
2.1 第一组
各种type类型,你可能会很奇怪,为什么搞这么复杂呢,刚开始时我也有同样的疑惑;其实这个跟traits编程方法相关了,内容还不少,放到后面再说吧。
typedef T value_type;
typedef T* pointer;
typedef const T* const_pointer;
typedef T& reference
typedef const T& const_reference
typedef size_t size_type
typedef ptrdiff_t difference_type
2.2 第二组
构造和析构函数
Allocator::Allocator()缺省构造函数
Allocator::Allocator(const Allocator&) copy构造函数
template <class U> Allocator::Allocator(const Allocator<U> &) 泛化的copy构造函数
Allocator::~Allocator() 缺省析构函数
还有一个rebind函数,llocator::rebind,一个nested class template,class rebind<U>有唯一的成员other,是一个typedef,代表Allcator<U>。
2.3 第三组
这是一组空间的释放与回收函数
pointer Allocator::allocate(size_type n, const void* = 0)
配置空间,足以缓存n个对象,第二个参数是个提示,实际上可能会用来增进区域性(locality),或完全忽略之。
void Allocator::deallocate(pointer p, size_type n)归还先前分配的空间
size_type Allocator::max_size() const 返回可分配的最大空间
2.4 第四组
一组取地址函数
pointer Allocator::address(reference x) const
返回x的地址,等同于&x
const_pointer Allocator::address(const_reference x) const
返回x的地址,等同于&x
2.5 第五组
construct和destroy函数
void Allocator::construct(pointer p, cosnt T&x)等同于new((const void*)p) T(x)
void Allocator::destroy(pointer p) 等同于p->~T()
Allocator可以非常简单,简单的执行内存分配和释放即可,也可以非常复杂,像SGI的分配器;这个应该根据就事而论。
三 SGI分配器
顺便提一下,SGI的分配器并没有遵照STL标准,为了减少内存碎片和分配效率,SGI的分配器实现是相当复杂的,它提供了两级分配器,对于大于128B的请求,采用第一级分配器,就是直接malloc,释放就是直接free;小于128B的分配器则采用了第二级分配器;看到这一部分时,让我想起了 Linux中的Slab分配器,专门针对小内存的分配策略,经常网上有人争论内存碎片问题,应该是根据操作系统而异的,像Linux应该是不存在这样的问题的,本身的小内存分配做的就是相当出色,这是题外话了。
先到这里吧,毕竟Allocator的内容还是相当多的。