《STL源码剖析》空间配置器
2015-07-18 23:37
246 查看
空间配置器(allocator) 空间配置器按我的理解就是C++ STL进行内存管理的组件(包括内存的申请和释放);当然,不只是内存,还可以向硬盘申请空间; 我主要看了内存的配置与释放(这里“配置”就应该是“申请”的意思)。STL对此设计的哲学主要包括以下四个方面: 1、向系统堆空间申请内存空间 2、考虑了多线程的情况下的申请; 3、考虑内存不足的应变措施; 4、考虑过多“小型区块”的内存碎片的问题; C++ 申请的基本动作是::operator new(),释放内存的基本动作是::operator delete()。而且,STL中的new和delete这两个运算符相当于malloc()和free()函数完成内存的申请和释放;(http://www.cppblog.com/michaelgao/archive/2008/06/05/52248.html阐述了C++ new的实现,其实用的就是malloc函数) STL设计了双层级的配置器: 1. 第一级配置器:直接使用malloc和new(); 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共计16个free lists.free lists的区域节点结构如下: union{ union obj * free_list_link; Char client_data[1] }
相关文章推荐
- 2015071803 - 番石榴园下的喧嚣
- webqq协议请求交互过程
- 游戏编程与游戏种类
- Python应用phy模块生成html表格
- android打包准备:混淆第三方jar包(Gson, greenDao,sharesdk,UIL,高德地图, unity,pinyin4j,async http,JPush,EventBus等)
- KNN算法(一)---opencv实现
- 泛型
- [BZOJ1263][SCOI2006]整数划分
- HDU 5276 YJC tricks time
- nat123访问者怎样用
- 初探Java多线程
- XMPP系列(一):OpenFire环境搭建
- java环境变量深入剖析
- XMPP系列(一):OpenFire环境搭建
- ComboBox控件“设置 DataSource 属性后无法修改项集合”的解决
- PHP使用数据库的并发问题
- HttpSessionListener的用法
- 使用IIS建立自己的网站、使用C#编写IIS模拟器,更好的理解Client和Server的relation
- JAVA笔记
- [CortexM0--stm32f0308]关于GPIO