STL 源码分析 (SGI版本, 侯捷著)
前言
源码之前,了无秘密
algorithm的重要性
效率的重要性
采用Cygnus C++ 2.91 for windows
cygwin-b20.1-full2.exe
下载地址:http://download.csdn.net/detail/ljljlj/3658798
安装后, 源码默认在:C:\cygnus\cygwin-b20\include\g++
第一章 STL概论
stl_config.h: 定义各个厂家编译器对C++特性的支持程度
__GNUC__ : 2
__GNUC_MINOR__ : 91
GNUC 2.91的能力
// (3) Defines __STL_STATIC_TEMPLATE_MEMBER_BUG if the compiler can't 
//       handle static members of template classes. 没有这个bug
// (5) Defines __STL_CLASS_PARTIAL_SPECIALIZATION if the compiler 
//       supports partial specialization of class templates.
// (6) Defines __STL_FUNCTION_TMPL_PARTIAL_ORDER if the compiler supports
//       partial ordering of function templates (a.k.a partial specialization
//       of function templates.
// (8) Defines __STL_MEMBER_TEMPLATES if the compiler supports
//       template members of classes.
// (10) Defines __STL_LIMITED_DEFAULT_TEMPLATES if the compiler is
//       unable to handle default template parameters that depend on
//       previous template parameters.
// (11) Defines __STL_NON_TYPE_TMPL_PARAM_BUG if the compiler has 
//       trouble performing function template argument deduction for
//       non-type template parameters.
__STL_NULL_TMPL_ARGS
__STL_TEMPLATE_NULL
临时对象
template<typename T>
class A{
void operator () (){
cout << "test" << endl
}
}
A()是一个临时对象, 不是函数调用
int(8)也是临时对象
仿函数
重载了 () 的对象时仿函数, 例如上面的A
函数指针无法保存局部状态, 也不能进行适配性adaptability
第二章 空间配置器
本章主要讲解内存分配和构造析构两部分知识。
其中构造析构利用template识别POD类型进行不同的操作, 以提高效率。
内存分配, 避免内存碎片和频繁申请小内存, 使用free_list保存16(8, 16 ... 128) 中不同大小的区块。
具体思想可以详细看第二章内容。
operator new
::operator new
placement new
new(p) T(value) // invoke ctor
void (* __malloc_alloc_oom_handler) (); // 这行是定义一个函数指针
等同于:
void (*) () __malloc_alloc_oom_handler;
这个函数怎么读
static void (* set_malloc_handler(void (*f)()))()
{
void (* old)() = __malloc_alloc_oom_handler;
__malloc_alloc_oom_handler = f;
return(old);
}
从里向外读吧,就是一个无形参,返回类型为void的函数f的指针,做为set_malloc_handler的一个形参;
而这个set_malloc_handler是一个函数, 返回值为一个函数指针;
而这个函数指针的定义是: 返回类型为void,且没有形参.
set_malloc_handler是个静态的函数。这个跟类内外没有关系。
STL 源码分析 (SGI版本, 侯捷著)的更多相关文章
- STL 源码分析《1》---- list 归并排序的 迭代版本, 神奇的 STL list sort
		
最近在看 侯捷的 STL源码分析,发现了以下的这个list 排序算法,乍眼看去,实在难以看出它是归并排序. 平常大家写归并排序,通常写的是 递归版本..为了效率的考虑,STL库 给出了如下的 归并排序 ...
 - STL源码分析读书笔记--第二章--空间配置器(allocator)
		
声明:侯捷先生的STL源码剖析第二章个人感觉讲得蛮乱的,而且跟第三章有关,建议看完第三章再看第二章,网上有人上传了一篇读书笔记,觉得这个读书笔记的内容和编排还不错,我的这篇总结基本就延续了该读书笔记的 ...
 - STL源码分析《4》----Traits技术
		
在 STL 源码中,到处可见 Traits 的身影,其实 Traits 不是一种语法,更确切地说是一种技术. STL库中,有一个函数叫做 advance, 用来将某个迭代器(具有指针行为的一种 cla ...
 - STL源码分析《3》----辅助空间不足时,如何进行归并排序
		
两个连在一起的序列 [first, middle) 和 [middle, last) 都已经排序, 归并排序最核心的算法就是 将 [first, middle) 和 [middle, last) 在 ...
 - stl源码分析之allocator
		
allocator封装了stl标准程序库的内存管理系统,标准库的string,容器,算法和部分iostream都是通过allocator分配和释放内存的.标准库的组件有一个参数指定使用的allocat ...
 - STL 源码分析六大组件-allocator
		
1. allocator 基本介绍 分配器(allocator))是C ++标准库的一个组件, 主要用来处理所有给定容器(vector,list,map等)内存的分配和释放.C ++标准库提供了默认使 ...
 - STL源码分析与实现-stl_list容器
		
1. stl_list 介绍 今天我们来总结一下stl_List, 通过之前介绍单链表的文章,其实对链表的基本操作已经十分熟悉了,那对于stl_list,无非就是链表结构不一样,至于其中的增删改查的细 ...
 - STL 源码分析《2》----nth_element() 使用与源码分析
		
Select 问题: 在一个无序的数组中 找到第 n 大的元素. 思路 1: 排序,O(NlgN) 思路 2: 利用快排的 RandomizedPartition(), 平均复杂度是 O(N) 思路 ...
 - STL源码分析之迭代器
		
前言 迭代器是将算法和容器两个独立的泛型进行调和的一个接口. 使我们不需要关系中间的转化是怎么样的就都能直接使用迭代器进行数据访问. 而迭代器最重要的就是对operator *和operator-&g ...
 
随机推荐
- Codeforces 835 F Roads in the Kingdom(树形dp)
			
F. Roads in the Kingdom(树形dp) 题意: 给一张n个点n条边的无向带权图 定义不便利度为所有点对最短距离中的最大值 求出删一条边之后,保证图还连通时不便利度的最小值 $n & ...
 - Pandas之DataFrame——Part 2
			
''' [课程2.] 时间模块:datetime datetime模块,主要掌握:datetime.date(), datetime.datetime(), datetime.timedelta() ...
 - this bind apply call
			
this 是当前函数运行时所属的对象bind 是指定一个函数运行时的上下文,也就是说把这个函数的this指向绑定到相应对象上,默认的暴露在全局御中的函数this指向widow对象, 严格模式下全局的t ...
 - 求LCA最近公共祖先的在线ST算法_C++
			
ST算法是求最近公共祖先的一种 在线 算法,基于RMQ算法,本代码用双链树存树 预处理的时间复杂度是 O(nlog2n) 查询时间是 O(1) 的 另附上离线算法 Tarjan 的链接: http ...
 - C++自带栈与队列_stack_queue_C++
			
栈和队列我们可以用C++里自带的函数使用,就不必手写了 1.栈,需要开头文件 #include<stack> 定义一个栈s:stack<int> s; 具体操作: s.emp ...
 - (1) python--numpy
			
废话不多说,直接上代码 import numpy as np # 如何创建一个数组 arr = np.array([1, 2, 3, 4]) print(arr) # [1 2 3 4] # 查看数组 ...
 - C#中一些关键字和罕见类
			
1.@ 在处理字符串时,那些个字符串转义字符我们可以使用这个,那@就是为解决这个而诞生的,直接让字符串原样输出有木有?什么sql字符串了,还有路径啥了的,统统搞定 string sql = @&quo ...
 - (11)oracle触发器
			
触发器是特殊的存储过程. 每当一个特定的数据操作语句(inster,update,delete)在指定的表上触发时,Oracle自动的地执行触发器中定义的语句序列. create trigger 触发 ...
 - hdu6053
			
hdu6053 题意 给出 \(A\) 数组,问有多少种 \(B\) 数组满足下面条件. \(1≤ B_i ≤ A_i\) For each pair \(( l , r ) \ (1≤l≤r≤n) ...
 - poj3415(后缀数组)
			
poj3415 题意 给定两个字符串,给出长度 \(m\) ,问这两个字符串有多少对长度大于等于 \(m\) 且完全相同的子串. 分析 首先连接两个字符串 A B,中间用一个特殊符号分割开. 按照 \ ...