STL源代码剖析(一) - 内存分配
Allocaor
allocator 指的是空间配置器,用于分配内存。
STL中默认使用SGI STL alloc作为STL的内存分配器,尽管未能符合标准规格,但效率上更好。
SGI STL也定义有一个符合标准,名为allocator的配置器,但SGI自己从未使用过它,主要原因是它仅仅把C++的new操作符和delete操作符做了一层薄薄的封装。
C++的new操作符和delete操作符进行内存配置时,new:先配置内存,然后构造对象。delete:先析构对象,然后释放内存。SGI STL将内存配置、释放内存与构造、析构分开。前者由<stl_alloc.h>中的allocate()和deallocate()负责,后者由<stl_construct.h>中的construct()和destroy()负责。 这两个头文件包括于<memory>中(STL标准规定,配置器定义在memory中)。同一时候<memory>还包括了一个文件<stl_unitialized.h>,定义了一些全局函数用来填充、复制大块内存数据。
STL allocator中,alloc::allocate负责内存配置,alloc::deallocate负责内存释放,alloc::construct负责对象构造,alloc::destroy负责对象析构。
SGI对空间的配置与释放的设计哲学:
1.向system heap要求空间;
SGI底层用的malloc和free完毕内存的配置和释放。
2.考虑多线程状态;
3.考虑内存不足时的应变措施;
4.考虑过多“小型区块”可能造成的内存碎片问题。
SGI设计了双层级配置器,第一级直接使用malloc和free,第二级配置器则视情况採用不同的策略:当配置区块超过128bytes时,视之为“足够大”,调用第一级配置器,当小于128bytes时,视之“过小”,为了减少额外负担,便採用复杂的memory pool方式,不再求助于第一级适配器。
一二级配置器关系例如以下
第一级配置器以malloc(),free(),realloc()等c函数运行实际的内存配置,释放,重配置操作,并实现相似 C++ new handler的机制(不能使用C++ new handler的原因时它并不是使用operator new 来配置内存)。
小额区块带来的事实上不仅时内存碎片,配置时的额外负担也是一个大问题,额外负担无法避免。
第二层配置器:假设区块勾搭,超过128bytes时,就移交第一层配置器处理,当区块小于128bytes时则以内存池管理。
内存基本处理工具
STL定义的五个全局函数
construct() - 构造
destroy() - 析构
uninitialized_copy(),uninitialized_fill(),uninitialized_fill_n() - 范围拷贝构造
关于拷贝构造的三个函数,可以将内存的配置与对象的构造行为分离。假设作为输入目的地的[result, result + (last-first)]范围内的每个迭代器都指向未初始化的区域,则uninitialized_copy()使用copy constructor,将输入来源范围内每个对象产生一份复制品,放进输出范围中。
容器的全区间构造函数通常以两个步骤完毕:
1.配置内存区块,是以包括范围内的全部元素;
2.使用uninitialied_copy(),在该内存区块上构造元素。
它们负责在已分配好的空间进行构造。C++标准要求uninitialized_copy具有"commit or rollback"语义:要么做完,要么不做。
在详细的实现中,这三个函数也用到了traits技法,通过traits萃取出元素的特性,假设是POD(Plain Old Data)型别,说明其拥有trivial ctor/ dtor/ copy/ assignment函数,因此可以使用copy()、fill()、fill_n()等算法,假设不是POD型别就仅仅可以循环调用construct()函数了。
參考
<<STL源代码剖析>> 侯捷译
STL源代码剖析(一) - 内存分配的更多相关文章
- 《STL源代码剖析》---stl_deque.h阅读笔记(2)
看完,<STL源代码剖析>---stl_deque.h阅读笔记(1)后.再看代码: G++ 2.91.57,cygnus\cygwin-b20\include\g++\stl_deque. ...
- STL源代码剖析 读书总结
<<STL源代码剖析>> 侯捷著 非常早就买了这本书, 一直没看, 如今在实验室师兄代码的时候发现里面使用了大量泛型编程的内容, 让我有了先看看这本书的想法. 看之前我对于泛型 ...
- STL源代码剖析——STL算法stl_algo.h
前言 在前面的博文中剖析了STL的数值算法.基本算法和set集合算法.本文剖析STL其它的算法,比如排序算法.合并算法.查找算法等等.在剖析的时候.会针对函数给出一些样例说明函数的使用.源代码出自SG ...
- STL源代码剖析——基本算法stl_algobase.h
前言 在STL中.算法是常常被使用的,算法在整个STL中起到很关键的数据.本节介绍的是一些基本算法,包括equal.fill.fill_n,iter_swap.lexicographical_comp ...
- STL源代码剖析——STL算法之set集合算法
前言 本节介绍set集合的相关算法,各自是并集set_union,差集set_difference,交集set_intersection 和对称差集set_symmetric_difference.这 ...
- STL源代码剖析(二) - 迭代器与traits技法
提要 先看一段用迭代器的代码: int a[] = {1, 2, 3, 4, 5}; vector<int> v1( a, a+5); vector<int>::iterato ...
- 《STL源代码剖析》---stl_alloc.h阅读笔记
这一节是讲空间的配置与释放,但不涉及对象的构造和析构,仅仅是解说对象构造前空前的申请以及对象析构后空间怎么释放. SGI版本号的STL对空间的的申请和释放做了例如以下考虑: 1.向堆申请空间 2.考虑 ...
- 解析STL中典型的内存分配
1 vector 在C++中使用vector应该是非常频繁的,但是你是否知道vector在计算内存分配是如何么? 在c++中vector是非常类似数组,但是他比数组更加灵活,这就表现在他的大小是可以自 ...
- STL 源代码剖析 算法 stl_algo.h -- inplace_merge
本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie inplace_merge(应用于有序区间) ----------------------- ...
随机推荐
- Android中倒计时代码
布局: maina.xml <DigitalClock android:id="@+id/myClock" android:layout_width="wrap_c ...
- ORA-12520错误解决一则
问题描写叙述: 今天突然发现连接数据库时报错,用pl/sql dev连接数据时,有时能连接上,有时连接时报: ORA-12520: TNS: 监听程序无法找到须要的server类型的可用句柄 通过se ...
- MyEclipse 2013 新功能介绍
http://pan.baidu.com/share/link?shareid=3310814720&uk=4012618212 下载地址 HTML5 Mobile Projects MyEc ...
- MySQL 全角转换为半角
序言: 用户注冊时候,录入了全角手机号码,所以导致短信系统依据手机字段发送短信失败.如今问题来了,怎样把全角手机号码变成半角手机号码? 1.手机号码全角转换成半角先查询出来全角半角都存在 ...
- Flex读取txt文件里的内容(二)
Flex读取txt文件里的内容 自己主动生成的文件 LoadTxt-app.xml: <?xml version="1.0" encoding="utf-8&quo ...
- Java中的statickeyword具体解释
1.statickeyword主要有2个作用: ①为某特定的数据类型或者对象分配单一的存储空间.而与创建对象的个数无关. ②在不创建对象的情况下能够直接通过类名来直接调用方法或者使用类的属性. 2.s ...
- NYOJ 104 最大子矩阵(二维DP)
最大和 时间限制:1000 ms | 内存限制:65535 KB 难度:5 描写叙述 给定一个由整数组成二维矩阵(r*c),如今须要找出它的一个子矩阵,使得这个子矩阵内的全部元素之和最大,并把这个 ...
- start_kernel——boot_init_stack_canary
/* * Initialize the stackprotector canary value. * * NOTE: this must only be called from functions t ...
- 《JavaScript设计模式与开发实践》读书笔记之模板方法模式
1. 模板方法模式 1.1 面向对象方式实现模板方法模式 以泡茶和泡咖啡为例,可以整理为下面四步 把水煮沸 用沸水冲泡饮料 把饮料倒进杯子 加调料 首先创建一个抽象父类来表示泡一杯饮料 var Bev ...
- Web监听器导图详解(转)
阅读目录 Web监听器 监听器的分类 Servlet版本与Tomcat版本 getAttribute与getParameter的区别 参考 监听器是JAVA Web开发中很重要的内容,其中涉及到的知识 ...