1.STL简介和空间配置器

STL(Standard Template Library,标准模板库),从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。
1、六大组件介绍

  1. 空间配置器:内存池实现小块内存分配,对应到设计模式–单例模式(工具类,提供服务,一个程序只需要一个空间配置器即可),享元模式(小块内存统一由内存池进行管理)
    2.迭代器:迭代器模式,模板方法
    3.容器:STL的核心之一,其他组件围绕容器进行工作:迭代器提供访问方式,空间配置器提供容器内存分配,算法对容器中数据进行处理,仿函数伪算法提供具体的策略,类型萃取  实现对自定义类型内部类型提取。保证算法覆盖性。其中涉及到的设计模式:组合模式(树形结构),门面模式(外部接口提供),适配器模式(stack,queue通过deque适配得  到),建造者模式(不同类型树的建立过程)。
    4.类型萃取:基于范型编程的内部类型解析,通过typename获取。可以获取迭代器内部类型value_type,Poter,Reference等。
    5.仿函数:一种类似于函数指针的可回调机制,用于算法中的决策处理。涉及:策略模式,模板方法。
    6适配器:STL中的stack,queue通过双端队列deque适配实现,map,set通过RB-Tree适配实现。涉及适配器模式。

2、空间配置器出现的原因:
我们在编程中经常会用到malloc,free动态申请,释放内存。这就造成六个问题:
1.外部内存碎片问题。就是你申请的内存有一两个释放,因为太小了,新来的大一点的要求就无法满足,这块内存就浪费,也就是说,内存剩余总量足够,但是都是分散的。
(内部碎片指的是内存对齐,为了提高cpu访问效率,我们申请char,只需要1字节,但是会分配四个字节)
2、因为小块内存经常调用malloc,会产生调用性能问题。要知道,寻找空闲内存块需要时间,如果找不到合并内存块也是要时间的。
3、如果没有及时释放空间会造成内存泄漏。

那么,stl中空间配置器的实现策略是:
如果用户申请空间大于128字节,就调用一级空间适配器,直接向系统申请,小于128字节,调用二级空间适配器,向内存池索取。

虽然这些知识对于程序员来说是透明的,但是了解会帮助我们更透彻。

3、内存池的概念
这就是为了解决内存碎片提出的。主要思想就是一次向堆申请很大一块内存(内存池),之后malloc就直接到内存池中分配。

4.一级空间配置器
直接封装了maloc(),free()函数,加上一个处理机制set_malloc_handler() 增加内存分配时客户端可选处理机制。
处理流程如下图:
在这里插入图片描述
源码也就是根据这个流程图的逻辑来的。在公共部分包含了静态方法malloc,free,重分配,private部分包含了分配失败的处理办法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值