重温《STL源码剖析》笔记 第二章
源码之前,了无秘密。 --侯杰
第二章:空间配置器 allocator
SGI特殊的空间配置器,std::alloc
SGI是以malloc()和free()完成内存的配置与释放。
SGI设计了双层级配置器:
第一级配置器直接使用malloc()和free(); _malloc_alloc_template
第二级配置器则视情况采用不用的策略: _default_alloc_template
当配置区块超过128bytes时,视之为“足够大”,便调用第一级配置器;
当配置区块小于128bytes时,视之为“过小”,为了降低额外负担,便采
用复杂的memory pool 整理方式,而不再求助于第一级配置器。
SGI包装的接口:simple_alloc
template<class T, class Alloc>
class simp_alloc {
public:
static T *allocate(size_t n) {
return ==n ? : (T*)Alloc:: allocate(n * sizeof(T));
}
static T *allocate(void) {
return (T*)Alloc::allocate(n * sizeof(T));
}
static void deallocate(T *p, size_t n) {
if( !=n) Alloc::deallocate(p, n* sizeof(T));
}
static T *deallocate(T *p) {
Alloc::deallocate(p * sizeof(T));
}
} template<class T, class Alloc = alloc)
class vector {
typedef simp_alloc<value_type, Alloc> data_allocator;
void deallocate() {
if(...)
data_allocator::deallocate(start,end_of_storage - start);
}
...
}
SGI第二级配置器会主动将任何小额区块的内存需求量上调至8的倍数(例如客户端要求 30bytes,
就自动调整为32bytes),并维护16个free-lists,各自管理大小分别为8, 16, 24,32, 40, 48, 56,
64,72, 80, 88, 96, 104, 112, 120, 128的小额区块。
freelist的节点结构如下:
union obj {
union obj* free_list_link;
char client_data[];
};
重新填充free lists .当发现free list 中没有可用区块时,就调用refill(),准备为free list 重新填充空间。
新的空间将取自内存池(经由chunk_alloc()完成)。缺省取得20个新节点(新区块),但万一内存池
空间不足,获得的节点数(区块数)可能小于20。
分配策略:
假设程序一开始,客户端就调用chunk_alloc(32,20),于是malloc()配置40个32bytes区块,其中第
一个交出(供使用,因为有请求),另19个交给free list[3]维护,余20个留给内存池。接下来客户
端调用chunk_alloc(64,20)此时free_list[7]空空如也,必须向内存池要求支持。内存池只够供应
(32*20)/64 =10个64bytes区块,就把这10个区块返回,第一个交给客户端,余9个由free_list[11]
维护。此时内存池全空。接下来再调用chunk_alloc(96,20),此时free_list[11]空空如也,必须向内存
池要求支持,而内存池也是空的,于是以malloc()配置 40+n(附加量)个96bytes区块,其中第一个
交出,另19个交给free_list[11]维护,余20+你(附加量)个区块留给内存池。
万一山穷水尽,整个system heap空间都不够了,malloc()将会行动失败,chunk_alloc()就四处寻找有无
“尚有未用区块,且区块够大”之free lists.找到就交出,找不到就调用第一级配置器。第一级配置器也是使用
的malloc()来配置内存,但是他有out-of-memory处理机制。或许会有机会释放别地的内存已使用,否则发
出bad_alloc异常。
重温《STL源码剖析》笔记 第二章的更多相关文章
- Stl源码剖析 第三章 iterator摘要
1. Stl的设计思想是: 将数据容器和算法分开,彼此独立设计,最后再以一贴胶合剂将它们撮合在一起,这个胶合剂就是迭代器. 2. 从3.2节迭代器的实现可知,如果要设计一个与容器分离实现的迭代器,会暴 ...
- STL源码剖析读书笔记之vector
STL源码剖析读书笔记之vector 1.vector概述 vector是一种序列式容器,我的理解是vector就像数组.但是数组有一个很大的问题就是当我们分配 一个一定大小的数组的时候,起初也许我们 ...
- 《STL源码剖析》读书笔记
转载:https://www.cnblogs.com/xiaoyi115/p/3721922.html 直接逼入正题. Standard Template Library简称STL.STL可分为容器( ...
- 通读《STL源码剖析》之后的一点读书笔记
直接逼入正题. Standard Template Library简称STL.STL可分为容器(containers).迭代器(iterators).空间配置器(allocator).配接器(adap ...
- c++ stl源码剖析学习笔记(一)uninitialized_copy()函数
template <class InputIterator, class ForwardIterator>inline ForwardIterator uninitialized_copy ...
- 面试题总结(三)、《STL源码剖析》相关面试题总结
声明:本文主要探讨与STL实现相关的面试题,主要参考侯捷的<STL源码剖析>,每一个知识点讨论力求简洁,便于记忆,但讨论深度有限,如要深入研究可点击参考链接,希望对正在找工作的同学有点帮助 ...
- 【STL 源码剖析】浅谈 STL 迭代器与 traits 编程技法
大家好,我是小贺. 点赞再看,养成习惯 文章每周持续更新,可以微信搜索「herongwei」第一时间阅读和催更,本文 GitHub : https://github.com/rongweihe/Mor ...
- STL"源码"剖析-重点知识总结
STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点略多 :) 1.STL概述 STL提供六大组件,彼此可以组合 ...
- 【转载】STL"源码"剖析-重点知识总结
原文:STL"源码"剖析-重点知识总结 STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点 ...
- (原创滴~)STL源码剖析读书总结1——GP和内存管理
读完侯捷先生的<STL源码剖析>,感觉真如他本人所说的"庖丁解牛,恢恢乎游刃有余",STL底层的实现一览无余,给人一种自己的C++水平又提升了一个level的幻觉,呵呵 ...
随机推荐
- Leetcode_20_Valid Parentheses
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41450987 通过本文你能学到如下知识: (1)对数据结构 ...
- PYTHON风格规范-Google 开源项目风格指南
Python风格规范 分号 Tip 不要在行尾加分号, 也不要用分号将两条命令放在同一行. 行长度 Tip 每行不超过80个字符 例外: 长的导入模块语句 注释里的URL 不要使用反斜杠连接行. Py ...
- 软考论文的六大应对策略V1.0
软考论文的六大应对策略V1.0 短短2个小时,要写3000字的文章,对习惯了用电脑敲字.办公的IT从业人员而言,难度不小.尤其,大家会提笔忘字.笔者的应试策略,就是勤学苦练,考试前的一个星期,摸清套路 ...
- 网站开发进阶(二十三)Address already in use: JVM_Bind <null>:8088
Address already in use: JVM_Bind <null>:8088 注:请点击此处进行充电! 阿里云服务器又莫名其妙的宕掉!内存泄漏问题依然存在,又出现了端口占用的情 ...
- zTree的调用设使用(跨两个系统,两类技术实现的项目案例SpringMVC+Spring+MyBatis和Struts2+Spring+ibatis框架组合)
1.从zTree官网上下载zTree的包,zTree的官方网址是:http://www.ztree.me/v3/main.php#_zTreeInfo 2.引入zTree所需的依赖,例如(jQuery ...
- 【Visual C++】游戏编程学习笔记之四:透明动画实现
本系列文章由@二货梦想家张程 所写,转载请注明出处. 本文章链接:http://blog.csdn.net/terence1212/article/details/44224963 作者:ZeeCod ...
- 【Matlab编程】生日快乐歌(显示歌词)—matlab版
clear all A4=440;%标准音A4 不同的曲调音调不同scale的取值范围不同 pt=44100;p0=pt/2;%频率 scale=A4/2^(9/12)*2.^((-12:11)/12 ...
- Android开发常用网站汇总
1.eoe Android开发者论坛 目前国内最早的Android开发者社区,人气非常旺聚集了不少Android开发方面的高手,开发中遇到的问题大都能在这里获得解决,网站最大的特色是定期发布<e ...
- TCP的核心系列 — SACK和DSACK的实现(四)
和18版本不同,37版本把DSACK的检测部分独立出来,可读性更好. 37版本在DSACK的处理中也做了一些优化,对DSACK的两种情况分别进行处理. 本文主要内容:DSACK的检测.DSACK的处理 ...
- 【Android 应用开发】自定义View 和 ViewGroup
一. 自定义View介绍 自定义View时, 继承View基类, 并实现其中的一些方法. (1) ~ (2) 方法与构造相关 (3) ~ (5) 方法与组件大小位置相关 (6) ~ (9) 方法与触摸 ...