更多精彩请关注微信公众号“爱折腾的码农”,如果大家感兴趣的,可以多多分享关注微信公众号,二维码见下图。
本篇内容主要介绍STL六大组件之一的空间配置器(alloctor),其分为一级空间配置器和二级空间配置器,二级空间配置器主要是为了解决小内存分配时产生的碎片化问题,实现思想是内存池。微信公众号原文链接:https://mp.weixin.qq.com/s/eTULOCRR7AzhANAvYbOKbw
引言
new分配内存主要含有两阶段操作
1.调用operator new分配内存;
2.调用类的构造函数构造对象内容;
delete释放内存也含有两阶段操作
1.调用析构函数将对象析构;
2.调用operator delete释放内存。
例:class Foo{...};
//配置内存,然后构造对象
Foo pf = new Foo;
//将对象析构,然后释放内存
dedlete pf;
为了精密分工,STL allocator决定将两阶段操作区分开来。
对于具体的实现细节可参考《STL源码剖析》,这里面主要给大家一些概念,相当于总览。接下来重点说一下STL空间配置器中内存分配,这部分在面试中可以作为自己的亮点,比说说超过128byte分配,小于128byte时二级配置器的分配方式,为什么要分成两种配置方式(因为分配小内存会存在内存碎片的问题)。
STL内存分配示意图
内存分配流程图
第一级空间配置器
代码
为什么使用malloc而不是new分配内存?
1、历史原因;
2、C++并未提供类似于realloc()的内存配置操作,因此,SGI不能直接使用C++的set_new_handler(),必须仿真出一个类似的set_malloc_handler()。
第二级空间配置器
二级空间配置器的实现原理
为什么使用union而不是struct?
1、减轻额外的内存负担,因为使用struct的话,每个节点需要额外的指针指向下一个节点。
2、实现一物两用,第一个字段中obj可看作一个指针指向相同类型的下一个obj,从第二个字段看,obj看作一个指针指向实际区块。
二级空间配置器分配示例