STL源码剖析 阅读(一)
1 概述
- 六大组件:容器、算法、迭代器、仿函数、配接器(adapter)、配置器(allocator)
- 仿函数:重载operator()
2 空间配置器 allocator
2.1 标准接口(P77)
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,调用第一级配置器
deallocate()
- 大于128bytes则调用第一级配置器,寻找对应free_list,插入区块
- construct()
- destroy()
- 包含两种,一种接受指针,将指针所指对象析构掉;另一种接受两个迭代器,将[first,last)间对象析构掉(只会对non trivial destructor进行析构调用)
- address()
- max_size()
- construct()
- destroy ()
2.1 内存基本处理工具
以下函数,要么全构造,要么全不构造
- uninitialized_copy(InputIterator first, InputIterator last, FowardIterator result)
- Pod类型调用stl copy(),否则调用construct(char和wchar使用特化版本,使用memmove)
- uninitialized_fill(FowardIterator first, FowardIterator last, const T& x)
- Pod类型调用stl fill(),否则调用construct
- uninitialized_fill_n(FowardIterator first, Size n, const T& x)
- 如果FowardIterator是Pod类型(用用trivial ctor/dtor/copy/assignment),交由高阶函数fill_n()执行;否则调用construct
STL源码剖析 阅读(一)相关推荐
- sarscape 将dem文件转化成stl_STL源码剖析 阅读笔记(一)介绍
一.学习动机 对C++的理解:最近因为工作原因需要重新对C++进行学习,而上一次系统.全局的学习C++已经是在本科时期了,然后是读研期间的第一年学过一点皮毛,后来对C++的学习都是边用边学.纵然这样已 ...
- STL源码剖析(十三)关联式容器之rb_tree
STL源码剖析(十三)关联式容器之rb_tree 文章目录 STL源码剖析(十三)关联式容器之rb_tree 一.rb_tree的数据结构 二.rb_tree的迭代器 三.rb_tree的操作 3.1 ...
- 【有点狂的手撕STL】STL源码剖析精读 000
STL源码剖析精读 前言 通过刷题感受到了C++中STL的妙用,十分的想要提高自己对于STL的理解以及运用能力,因此开设此专栏,并希望能够带领大家一起感受C++中STL的魅力. 一.STL简介 STL ...
- STL源码剖析学习七:stack和queue
STL源码剖析学习七:stack和queue stack是一种先进后出的数据结构,只有一个出口. 允许新增.删除.获取最顶端的元素,没有任何办法可以存取其他元素,不允许有遍历行为. 缺省情况下用deq ...
- 《STL源码剖析》学习-- 1.9-- 可能令你困惑的C++语法1
最近在看侯捷的<STL源码剖析>,虽然感觉自己c++看得比较深一点,还是感觉还多东西不是那么明白,这里将一些细小的东西或者概念记录一下. 有些东西是根据<C++编程思想>理解的 ...
- 《STL源码剖析》学习--6章--_rotate算法分析
最近在看侯捷的<STL源码剖析>,其中有许多不太明白之处,后经分析或查找资料有了些理解,现记录一下. <STL源码剖析>学习--6章--random access ite ...
- 《STL源码剖析》学习--6章--power算法分析
最近在看侯捷的<STL源码剖析>,其中有许多不太明白之处,后经分析或查找资料有了些理解,现记录一下. 6章--power算法分析 书本中的算法如下所示: template <clas ...
- STL源码剖析——P142关于list::sort函数
在list容器中,由于容器自身组织数据的特殊性,所以list提供了自己的排序函数list::sort, 并且实现得相当巧妙,不过<STL源码剖析>的原文中,我有些许疑问,对于该排序算法,侯 ...
- STL源码剖析---红黑树原理详解下
转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/7760584 算法导论书上给出的红黑树的性质如下,跟STL源码 ...
- STL源码剖析面试问题
当vector的内存用完了,它是如何动态扩展内存的?它是怎么释放内存的?用clear可以释放掉内存吗?是不是线程安全的? vector内存用完了,会以当前size大小重新申请2* size的内存,然后 ...
最新文章
- 机器学习:协方差矩阵
- 会话跟踪技术Cookieless
- C#实现在Winform中嵌入Word和Excel
- python 逗号作用 语句间_Python中逗号的三种作用
- [NOIP2014]联合权值
- 演练 多班分数录入统计优秀人数
- Flash Builder 的概要分析
- halcon 灰度投影
- 大数据:一张图让你明白什么是大数据
- 鲸飞酒店云PMS v3.0.22
- STM32f407程序移植到GD32F407
- 曾經的文字﹐曾經的歲月
- 【题解】 Test 买水的ACX(套路)
- VMvare win7软件闪退
- 世界各国当日数据探索性分析
- Java使用cookie和session管理用户状态
- CSS基础之背景样式
- 梅科尔工作室-江凌宇-鸿蒙笔记3
- python 自行安装第三方库包
- (附源码)Node.js自我展示博客网站 毕业设计 231547