《STL源碼剖析》學習心得(一)


上上個月,買了《STL源碼剖析》這本書,大概瀏覽了下,有了個大體的印象。看書的過程中,很多技術細節剛開始還記得的,但是隨着內容越來越多,前面看過的知識點到后面就記得不是很清楚了,有點囫圇吞棗的感覺。

本書的作者侯捷先生在這本書開始,用“天下大事 必作於細”來激勵讀者,說明技術細節的重要性。當我第二遍翻開這本書的時候,想征服STL這座大山的欲望也變得更為強烈。

從大學開始到現在,一直有個遺憾,就是心態很浮躁,沒有靜下心來深入地學習一門技術,總是淺嘗輒止、半途而廢,導致知識點掌握不扎實,什么東西都知道一點,但是什么東西都沒有完全掌握。這一點一直困擾着我,也很大程度上阻礙了自己的科研能力。

今天,翻開了前些日子下載的《深入理解計算機系統》,里面的內容非常充實,很多東西都聽說過,或者了解那么一些,可是深入進去看,總是感覺好多都不懂。

這種情況需要改變!

作為一名計算機系的研究生,之前的學習方法和態度存在很多問題,需要下決心來改變。

今天的日子也非常巧,2012/12/12,截圖做個紀念。

image

讓這一天成為新的學習的開始!

 

上午看了《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中的基本知識:所有的迭代器標識的區間都是前閉后開的,即[ )。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM