C++学习篇(6)

更多精彩请关注微信公众号“爱折腾的码农”,如果大家感兴趣的,可以多多分享关注微信公众号,二维码见下图。
在这里插入图片描述

       本篇内容主要介绍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;

扫描二维码关注公众号,回复: 12255806 查看本文章

        //将对象析构,然后释放内存

        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看作一个指针指向实际区块。

二级空间配置器分配示例

猜你喜欢

转载自blog.csdn.net/weixin_43305362/article/details/112304306