1 概述

  • 六大组件:容器、算法、迭代器、仿函数、配接器(adapter)、配置器(allocator)
  • 仿函数:重载operator()

2 空间配置器 allocator

2.1 标准接口(P77)

  1. allocator(): 双层级配置器(采用哪种取决于__USE_MALLOC是否被定义)
    1.1 大于128bytes,调用第一级配置器(__malloc_alloc_template)

    • 使用malloc和free,配置失败时有相应的oom_malloc/oom_realloc,并可自定义out-of-memory handler

    1.2 小于128bytes时,采用memory pool(__default_alloc_template)

    • 维护16个free-lists(各自管理8,16,24,…,128bytes的区块)

    • free-list node

      union obj{union obj *free_list_link; //指向区块地址char client_data[1];          } 
    • 大于128bytes则调用第一级配置器,找到free-list中最适当的一个。如果没有可用的区块,重新填充free-list(refill),并返回区块;否则调整free-list并返回区块(从free-list移除该区块)

    • refill(size_t n) 使用chunk_alloc()取得新区块(新的n个区块为连续),n为8的整数

    • chunk_alloc(size_t n, int& nobjs) 如果剩余空间(部分/完全)满足需求则返回;否则,malloc(两倍需求量+1/16的heap_size)。如果成功设置对应的start_free/end_free/heap_size;否则,先将剩余空间给适当的free-list,然后从后面的free-list寻找未用区块并设置对应的start_free/end_free,然后递归调用chunk_alloc()返回可用区块,如果内存全用完,end_free=start_free=0,调用第一级配置器

  2. deallocate()

  • 大于128bytes则调用第一级配置器,寻找对应free_list,插入区块
  1. construct()
  2. destroy()
  • 包含两种,一种接受指针,将指针所指对象析构掉;另一种接受两个迭代器,将[first,last)间对象析构掉(只会对non trivial destructor进行析构调用)
  1. address()
  2. max_size()
  3. construct()
  4. destroy ()

2.1 内存基本处理工具

以下函数,要么全构造,要么全不构造

  1. uninitialized_copy(InputIterator first, InputIterator last, FowardIterator result)
  • Pod类型调用stl copy(),否则调用construct(char和wchar使用特化版本,使用memmove)
  1. uninitialized_fill(FowardIterator first, FowardIterator last, const T& x)
  • Pod类型调用stl fill(),否则调用construct
  1. uninitialized_fill_n(FowardIterator first, Size n, const T& x)
  • 如果FowardIterator是Pod类型(用用trivial ctor/dtor/copy/assignment),交由高阶函数fill_n()执行;否则调用construct

STL源码剖析 阅读(一)相关推荐

  1. sarscape 将dem文件转化成stl_STL源码剖析 阅读笔记(一)介绍

    一.学习动机 对C++的理解:最近因为工作原因需要重新对C++进行学习,而上一次系统.全局的学习C++已经是在本科时期了,然后是读研期间的第一年学过一点皮毛,后来对C++的学习都是边用边学.纵然这样已 ...

  2. STL源码剖析(十三)关联式容器之rb_tree

    STL源码剖析(十三)关联式容器之rb_tree 文章目录 STL源码剖析(十三)关联式容器之rb_tree 一.rb_tree的数据结构 二.rb_tree的迭代器 三.rb_tree的操作 3.1 ...

  3. 【有点狂的手撕STL】STL源码剖析精读 000

    STL源码剖析精读 前言 通过刷题感受到了C++中STL的妙用,十分的想要提高自己对于STL的理解以及运用能力,因此开设此专栏,并希望能够带领大家一起感受C++中STL的魅力. 一.STL简介 STL ...

  4. STL源码剖析学习七:stack和queue

    STL源码剖析学习七:stack和queue stack是一种先进后出的数据结构,只有一个出口. 允许新增.删除.获取最顶端的元素,没有任何办法可以存取其他元素,不允许有遍历行为. 缺省情况下用deq ...

  5. 《STL源码剖析》学习-- 1.9-- 可能令你困惑的C++语法1

    最近在看侯捷的<STL源码剖析>,虽然感觉自己c++看得比较深一点,还是感觉还多东西不是那么明白,这里将一些细小的东西或者概念记录一下. 有些东西是根据<C++编程思想>理解的 ...

  6. 《STL源码剖析》学习--6章--_rotate算法分析

     最近在看侯捷的<STL源码剖析>,其中有许多不太明白之处,后经分析或查找资料有了些理解,现记录一下. <STL源码剖析>学习--6章--random access ite ...

  7. 《STL源码剖析》学习--6章--power算法分析

    最近在看侯捷的<STL源码剖析>,其中有许多不太明白之处,后经分析或查找资料有了些理解,现记录一下. 6章--power算法分析 书本中的算法如下所示: template <clas ...

  8. STL源码剖析——P142关于list::sort函数

    在list容器中,由于容器自身组织数据的特殊性,所以list提供了自己的排序函数list::sort, 并且实现得相当巧妙,不过<STL源码剖析>的原文中,我有些许疑问,对于该排序算法,侯 ...

  9. STL源码剖析---红黑树原理详解下

    转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/7760584       算法导论书上给出的红黑树的性质如下,跟STL源码 ...

  10. STL源码剖析面试问题

    当vector的内存用完了,它是如何动态扩展内存的?它是怎么释放内存的?用clear可以释放掉内存吗?是不是线程安全的? vector内存用完了,会以当前size大小重新申请2* size的内存,然后 ...

最新文章

  1. 机器学习:协方差矩阵
  2. 会话跟踪技术Cookieless
  3. C#实现在Winform中嵌入Word和Excel
  4. python 逗号作用 语句间_Python中逗号的三种作用
  5. [NOIP2014]联合权值
  6. 演练 多班分数录入统计优秀人数
  7. Flash Builder 的概要分析
  8. halcon 灰度投影
  9. 大数据:一张图让你明白什么是大数据
  10. 鲸飞酒店云PMS v3.0.22
  11. STM32f407程序移植到GD32F407
  12. 曾經的文字﹐曾經的歲月
  13. 【题解】 Test 买水的ACX(套路)
  14. VMvare win7软件闪退
  15. 世界各国当日数据探索性分析
  16. Java使用cookie和session管理用户状态
  17. CSS基础之背景样式
  18. 梅科尔工作室-江凌宇-鸿蒙笔记3
  19. python 自行安装第三方库包
  20. (附源码)Node.js自我展示博客网站 毕业设计 231547

热门文章

  1. CSS选择器之基本选择器总结
  2. Swift 实践之UIWebView
  3. Qt 学习之路 2(84):Repeater
  4. 如何在delphi里面控制Edit只能输入数字
  5. 律师总结二手房买卖中的八大陷阱
  6. layui 之button 事件绑定的一种方法
  7. ubuntu卸载和安装mysql
  8. 调试ffmpeg源码配置config参数(包管用)
  9. GCC Link Time Optimization
  10. windows与ubuntu Centos系统下载站点整理(自用)