【STL】空间配置器(二):二级空间配置器

本文详细探讨了SGI STL空间配置器中的二级空间配置器,旨在解决内存碎片和性能问题。二级配置器由内存池和free_list组成,小内存块从内存池分配,大内存块通过一级配置器分配。文章分析了源码,包括free_list结构、内存块调整、内存分配与释放等关键环节,有助于理解STL内存管理机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;     
 //这个参数暂不解释
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值