******************************************************************************************************
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源码 可以直接下载!!!