STL二:Allocator空间分配器一

rel="File-List" href="file:///E:%5Ctmp%5CAPPLIC%7E1%5Cmsohtml1%5C01%5Cclip_filelist.xml">

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 templateclass 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 第五组

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

 

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

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值