STL源码剖析——空间配置器和迭代器

特此申明:

前段时间找工作所以看了《STL源码剖析》,整理的时候除了参考网上已有的笔记贴,加上自己整合的,可能和别人有雷同之处。不过无所谓啦,写出来自己看看,需要的朋友参考下,仅此而已。

空间配置器

         空间配置器其实就是C++ STL进行内存管理的组件(包括内存的申请和释放);当然,不只是内存,还可以向硬盘申请空间。为了精密分工,内存配置::operator new() 时先分配内存,再构造函数;释放行为::operator delete() 则是先析构对象再释放内存。

         对于内存的配置与释放,STL对此设计的哲学主要包括以下四个方面:

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

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

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

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

         考虑到小型区块造成的内存破碎问题,SGO设计了双层配置器:

1.  第一级配置器:直接使用malloc和free();

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的时候,则以内存池管理,此方法是:每次配置一大块内存,并维护对应之自由链表,有需求时直接从free-lists分配和回收,同时任何小额区块的内存需求量上调至8的倍数,各自管理8,16,24,32,……128Bytes共计16free lists

迭代器和traits编程技法

         迭代器模式:提供一种方法,使之能够依序寻访某个聚合物所含的各个元素,而又无需暴露该聚合物的内部表述方式。

         迭代器设计思维——STL关键所在。其中心思想:将数据容器和算法分开,彼此独立设计,最后再以一贴胶着剂将它们粘合一起。迭代器是一种行为类似指针的对象,最重要的是内容提领和成员访问,所以编程工作就是对operator*he operator->进行重载。指针后跟的角括号放的是“原生指针所指对象”的类型,而不是指针的类型。

         迭代器的相应型别使用functiontemplate的参数推到机制解决。迭代器相应型别不只是迭代器所指对象的型别一种,最常用的相应型别有五种,并非任何情况下任何一种都可以利用template参数推到机制来取得。

         Traits编程技法——STL源代码门钥(这部分还没有仔细看,所以以后有时间再更新)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值