《STL源码剖析》学习心得(一)

时间:2021-12-28 16:26:24

上上个月,买了《STL源码剖析》这本书,大概浏览了下,有了个大体的印象。看书的过程中,很多技术细节刚开始还记得的,但是随着内容越来越多,前面看过的知识点到后面就记得不是很清楚了,有点囫囵吞枣的感觉。

本书的作者侯捷先生在这本书开始,用“天下大事 必作于细”来激励读者,说明技术细节的重要性。当我第二遍翻开这本书的时候,想征服STL这座大山的欲望也变得更为强烈。

从大学开始到现在,一直有个遗憾,就是心态很浮躁,没有静下心来深入地学习一门技术,总是浅尝辄止、半途而废,导致知识点掌握不扎实,什么东西都知道一点,但是什么东西都没有完全掌握。这一点一直困扰着我,也很大程度上阻碍了自己的科研能力。

今天,翻开了前些日子下载的《深入理解计算机系统》,里面的内容非常充实,很多东西都听说过,或者了解那么一些,可是深入进去看,总是感觉好多都不懂。

这种情况需要改变!

作为一名计算机系的研究生,之前的学习方法和态度存在很多问题,需要下决心来改变。

今天的日子也非常巧,2012/12/12,截图做个纪念。

《STL源码剖析》学习心得(一)

让这一天成为新的学习的开始!

 

上午看了《STL源码剖析》的第1章,虽然STL的六大部件从第2章才正式开始,但第一章的内容还是非常有意思。

 

首先,STL的历史和意义,作者说,“99.99%的程序员所写的程序,在SGI STL面前都是三流水准“,侯捷是一位博学、在C++方面有极深造诣的学者,这句话从他口中说出,意义可想而知。

我想起来Scott Mayer大神在《Effective STL》中说过的一句话,“In the nearly 30 years I’ve been programming, I’ve never seen anything like the STL.”。多么高的评价!

STL是GP的杰出成果。在OOP盛行的过去十年间,GP的位置显得比较尴尬,很多人都知道OOP,但是知道GP的人就少很多,别提对GP的认识了。OOP和GP都能够提供对代码的复用,OOP更侧重于设计,而GP则更侧重于抽象概念。从某种程度上讲,GP的耦合度要低于OOP。STL的创新价值便在于具体叙述了各种抽象概念,并加以系统化。

 

其次,STL与C++之间的关系。C++的标准化之路可谓曲折,1994年,就在C++的标准快要定案进行表决时,STL进入了标准委员会的视野。标准委员会决定给STL提案一个机会,将决定性的投票延迟到下一次会议。这个机会最终使得STL进入了C++标准,一方面使得C++语言发生了重大改变,但另一方面也使得C++语言失去了宝贵的发展机遇(1994-1998,C++在标准化过程中多花掉的4年的时间使得其它语言有了生存的机会,如果C++在94年就能标准化,Java是够有今日的辉煌还不得而知。我个人感觉,如果C++在94年完成标准化,C++一统天下的可能性较大)。从这个意义上来看,可以说STL是C++又恨又爱的一个部分。

 

C++分为六大组件,分别是Container(容器)、Algorithm(算法)、Iterator(迭代器)、Functor(仿函数)、Adapter(配接器)和Allocator(配置器)。

它们之间的关系:Container通过Allocator取得数据存储空间,Algorithm通过Iterator存取Container内容,Functor可以协助Algorithm完成不同的策略变化,Adapter可以修饰或套接Functor。

STL的实现版本主要分为3家:P. J. Plauger实现版本(或者叫Dinkumware版本,被Visual C++采用)、Rouge Ware实现版本(被Borland C++采用)和SGI实现版本(被GNU C++采用)。这3家STL都源于HP版本,其中SGI版本还有一个移植版本,即STLport。

据侯捷先生的比较,SGI版本的可读性最好,加上GNU C++对C++的语言特性支持也是非常好的(最新的4.7.2版本支持大部分C++11特性,比Visual C++ 2012好,比Clang稍微少一些),也给SGI STL带来了正面影响。

SGI的内部实现都是在stl_开头的文件当中,C++标准中规定的头文件基本上是包含了这些头文件。

其中stl_config.h文件中,定义了与编译器实现相关的常量,标识某些组态(个人感觉也可以叫配置,就是通过define来标识编译器是够支持某个功能)是够存在。比如,__STL_STATIC_TEMPLATE_MEMBER_BUG这个宏就用来标识当前的编译器无法处理staic members of template classes,即存在这个bug。

由于STL是基于C++语言中的模板特性,所以编译器的支持显得很重要。泛型编程中常用到的技术,如参数推导(argument deduction)、偏特化(partial specification)都是要先掌握了才能继续深入学习STL的。否则,很多语法会很难看懂。

这篇文章就写这么多了,后面再陆续补上每个章节的心得。最后提一下,STL中的基本知识:所有的迭代器标识的区间都是前闭后开的,即[ )。