SGI STL一级空间配置器:
http://blog.csdn.net/bit_clearoff/article/details/53503846
前面我们已经分析过了SGI STL一级空间配置器的实现以及其中的相关机制,今天我们主要来分析一下空间配置器中的重头戏:二级空间配置器。我们先来用图描述一下二级空间配置器的结构:
上图是二级空间配置器的基本结构是有一块事先分配好内存的内存池和一个给对象拨内存块的free_list所组成的,为什么要引入内存池而不是直接从操作系统中给free_list分配内存呢?这时为了解决内存碎片和操作系统不断的分配小内存块所存在的性能上的问题,详情大家可以看一下
http://blog.csdn.net/bit_clearoff/article/details/53503846
这篇文章,这里只简单的提一下内存碎片是由于操作系统调用malloc函数不断地开辟和释放小内存块,然后当要开辟一块大内存块时,上面的小内存块不足以使用,从而是这些小内存块成为了内存碎片。而内存池就可以很好的解决这个问题,当我们开辟小内存块时,就在自由链表中找到合适的内存空间供给对象使用,如果free_list的合适的位置上没有内存空间了,便会从内存池中拨出空间;在SGI STL的二级空间配置器中,默认>128bytes的内存空间为大块内存,这时候会直接调用一级空间配置器去分配大块内存空间。下面我们将会详细的讲下这个过程
SGI STL空间配置器的实现机制
二级空间配置器源码分析
我在源码中进行了相关的解读
二级空间配置器的定义
template <bool threads, int inst>
class __default_alloc_template
free_list的相关参数
# ifndef __SUNPRO_CC
//小型区块的上调边界
//为什么上调至8呢,因为32位系统的指针4bytes
//64位系统下的指针为8bytes这里取最大值
enum {__ALIGN = 8};
//free_list的区块上限(128bytes)
enum {__MAX_BYTES = 128};
//free_list数组中自由链表的个数
enum {__NFREELISTS = __MAX_BYTES/__ALIGN};
# endif
将要开辟的区块大小上调至8的倍数
static size_t ROUND_UP(size_t bytes) {
return (((bytes) + __ALIGN-1) & ~(__ALIGN - 1));
}
free_list中的节点结构
union obj {
//将节点链起来的指针
union obj * free_list_link;
//这个参数暂不解释