stl剖析之空间配置器(allocator)

******************************************************************************************************

STL的六大组件:(1)容器:containers  (2)算法:algorithms (3)迭代器:iterator (4)仿函数:functors 

               (5)配接器:adapters (6)配置器:allocators

STL六大组件的交互关系:配置器是幕后奉献者,用来分配空间,算法通过迭代器来进行容器内容的存取等操作,

仿函数协作算法完成不同的策略的变化,算法可以修饰或套接仿函数。

******************************************************************************

空间配置器是什么?就对STL的操作对象而言。都存放在容器内,而容器一定需要配置空间以置放

资料。而为什么不说allocator是内存配置器而说它是空间配置器呢?

因为空间不一定是内存,空间也可以是磁盘或者其他的存储介质。而我要介绍的是SGI STL提供的

配置器,配置它的对象是内存。

*****************************************************************************

一般而言,我们所习惯的c++内存配置操作和释放操作是:

class{ ... };
Foo* pf = new Foo;
delete pf

其中的new算式含有两阶操作,1.调用operator new 配置内存 2.调用 Foo::Foo构造对象内容。

delete算式也内含两阶操作:对象析构 2.释放内存;

Stl的配置器定义于<memory>中,SGI中含有以下两个文件:

#include<stl_alloc.h>    //空间配置释放

#include<stl_construct.h> //对象内容构造析构

其分为一级和二级配置器 :


其整体框架就是如此,小雷同学将个人之前的一些疑惑给大家也来分享分享!

1.1首先它是如何将各个空间联系起来的?

仔细查找你会发现在它的__default_Alloc_template函数中有了定义,相当于链表串起来

2.2它是如何将没有使用完的空间拿出来使用的?如何确保肯定够用呢?

大家可以仔细观察配置器的私有成员定义,它每次都定义的上调8个,如果你不够它也会给你多余的空间。它定义的大小

都是8 16 24 32 40... 而且它的函数传参都是以N个 xxbytes大小传的,并且要求是区块足够大。

3.3内存池机理是什么?

举个例子:源码中是以end_free-start_free判断是否足够,如果足够就直接调用20区块给free list

如果不足,单是还足以一个以上的区块,就拔出不足的20个区块空间出去,这时候的nobjs将被修改为实际供应大小

如果内存池不够了,那便alloc,上调两倍,从heap中调用,如果山穷水尽那么就只能使用一级配置器了。

提醒:new_handler机制只是二级配置器使用,因为不是以Operate new机制开辟空间的。而且内存不足处理例程由客户端定义!

个人觉得其设计的太巧妙了,使用位运算等空间开辟的大小,回收时候很好用,它的大小都是固定的。其中的一些机理

加上数学的操作,真的是太巧妙了!

***********************************************************************************************************************************

附源码:0.0.

我的源码被我改的不成样子了,这个大家想看的可以自己下载!百度搜索 SGI STL源码 可以直接下载!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值