《STL源码剖析》读书笔——(1)空间配置器

第二章 空间配置(allocator)

空间配置器按我的理解就C++ STL进行内存管理的组件(包括内存的申请和释放);当然,不只是内存,还可以向硬盘申请空间;

我主要看了内存的配置与释放(这里“配置”就应该是“申请”的意思)。STL对此设计的哲学主要包括以下四个方面:

1、向系统堆空间申请内存空间

2、考虑了多线程的情况下的申请;

3、考虑内存不足的应变措施;

4、考虑过多“小型区块”的内存碎片的问题;

C++ 申请的基本动作是::operator new(),释放内存的基本动作是::operator delete()。而且,STL中的newdelete这两个运算符相当于malloc()free()函数完成内存的申请和释放;(http://www.cppblog.com/michaelgao/archive/2008/06/05/52248.html阐述C++ new的实现,其实用的就是malloc函数

STL设计了双层级的配置器:

1.  第一级配置器:直接使用mallocnew()

2.  当配置区域超过128bytes的时候,则使用第一级配置器;当配置区域小于128bytes的时候,采用了“内存池”的概念

第一级配置器以malloc(),free(),realloc()C函数执行实际的内存配置、释放、重配置操作,并实现类似C ++ new handler的机制。

    所谓C++ new handler机制,你可以要求系统在内存配置需求无法被满足的时候,调用一个你指定的函数。

    SGI第一级配置器的allocate()relloc()函数都是在调用malloc()realloc()函数不成功后,调用oom_malloc()oom_relloc()函数,后两者都有内循环,不断调用“内存处理不足处理例程”,期望在某次调用之后,获得足够的内存而完成任务。但是如果“内存处理不足处理例程”并未被客端设定,oom_malloc()oom_relloc()函数就抛出bad_alloc异常,或者用exit(1)终止程序;

    SGI第二级配置器的配置策略:如果区域足够大,大于128Bytes,就移交给第一级配置器处理;当区域小于128Bytes的时候,则以内存池管理;

    内存池管理策略:主动将任何小额区域块得内存需求量上调至8的倍数,各自管理8,16,24,32,……128Bytes共计16free lists.free lists的区域节点结构如下:

    union{

    union obj * free_list_link;

    Char client_data[1]

}

至于采用联合体而不是结构体的原因是减小系统负担。(具体的原因没有看懂)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值