STL二:Allocator空间分配器一- sparkliang的专栏- CSDN博客

Allocator空间分配器一

简介

Allocator分配器是STL的重要组件,负责为容器Container中的元素分配和释放空间,前面也说过将Allocator独立出来的好处就是可以实现不同的分配策略,因而可以根据需要使分配尽可能的{zy}化;而且这也使定制自己的分配器成为可能。

Allocator分配的空间不一定就是内存,你可以从任何可行的地方分配内存,比如磁盘。

 

Allocator的标准接口

为了给各种Container提供空间分配/释放的能力,Allocator必须具有一组标准的接口,直接照搬列出了,全部死记这些对能力也不会有什么提高,重要的是能够自己根据需要实现一个Allocator就行了。

2.1 {dy}组

各种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 templateclass rebind<U>有{wy}的成员other,是一个typedef,代表Allcator<U>

 

2.3 第三组

这是一组空间的释放与回收函数

pointer Allocator::allocate(size_type n, const void* = 0)

配置空间,足以缓存n个对象,第二个参数是个提示,实际上可能会用来增进区域性(locality),或xx忽略之。

void Allocator::deallocate(pointer p, size_type n)归还先前分配的空间

size_type Allocator::max_size() const 返回可分配的{zd0}空间

 

2.4 第四组

一组取地址函数

pointer Allocator::address(reference x) const

返回x的地址,等同于&x

const_pointer Allocator::address(const_reference x) const

返回x的地址,等同于&x

2.5 第五组

constructdestroy函数

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的请求,采用{dy}级分配器,就是直接malloc,释放就是直接free;小于128B的分配器则采用了第二级分配器;看到这一部分时,让我想起了 Linux中的Slab分配器,专门针对小内存的分配策略,经常网上有人争论内存碎片问题,应该是根据操作系统而异的,像Linux应该是不存在这样的问题的,本身的小内存分配做的就是相当出色,这是题外话了。

 

先到这里吧,毕竟Allocator的内容还是相当多的。

 

 

 

发表于 @ 2009年01月12日 19:01:00 | | | |

 | 

郑重声明:资讯 【STL二:Allocator空间分配器一- sparkliang的专栏- CSDN博客】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——