Google的優秀C++開源項目繁多,其中的Chromium瀏覽器項目可以說是很具有代表性的,此外還包括其第三開發開源庫或是自己的優秀開源庫,可以根據需要抽取自己感興趣的部分。在研究、學習該項目前的時先獲取到需要獲取一份谷歌的Chromium源碼,可參考:http://blog.csdn.net/kuerjinjin/article/details/23563059,若無法獲取且打算使用VS IDE的可從此處下載:http://blog.csdn.net/kuerjinjin/article/details/23563059獲取帶有解決方案的源碼,編譯成功可能需要修改部分工程配置;因其源碼后來有所改變,不過主要的部分內容變化不大,此外因學習需要不必要尋求最新版本的源碼,此處將以采用Chromium39.0.2132.2版本作為參考;Chromium源碼結構可參考:http://blog.csdn.net/blessyou312/article/details/6253050;
因學習需要暫不先站在考慮高層次的角度,如設計模式、模型、線程進程等通信交互細節;只是作為初學者或是本人學習記錄,從底層細節了解整個谷歌的Chromium源,后期將逐步學習高層次內容;此外google源碼風格也是可以借鑒的,具體采用的編程、源碼風格可根據自身愛好或是公司內部要求進行制定。
拿到Chromium代碼后,你會發現有很多頂級目錄,其中的base庫:為所有子工程共用的通用代碼。它包括字符串操作、文件、線程、消息、內存管理等通用庫,作為其他所有頂層工程間共用的東西。感興趣的可以從中抽取該base庫單獨研究或是應用到自己的項目中,作為可用的公共庫部分也是個不錯的做法。因該工程內部內容比較零散,我們將按照模塊划分的方式來了解、學習;先羅列其他文件依賴的最最基礎的文件,然后針對各模塊詳細分析、學習。
base_export.h:主要用以對不同的平台定義了導入和導出庫相關的宏:BASE_EXPORT;該類宏將貫穿整個base庫。
basictypes.h:主要根據不同平台的支持聲明定義變量類型的簡單別名如typedef int int32等;各種常用類型最大最小值變量定義(8、16、32、64位符號和無符號整數);宏聲明DISALLOW_COPY、DISALLOW_ASSIGN、DISALLOW_COPY_AND_ASSIGN、DISALLOW_IMPLICIT_CONSTRUCTORS等在類的私有訪問控制域中分別用以不可拷貝、不可賦值轉讓、不可拷貝和賦值以及既不可拷貝賦值和構造,默認的C++類都有拷貝功能和默認構造函數,很多時候我們會常常使用DISALLOW_COPY_AND_ASSIGN用以防止對象被拷貝與賦值轉讓,可防止因深淺拷貝等導致的指針釋放等錯誤,DISALLOW_IMPLICIT_CONSTRUCTORS也可以達到此目的且可以防止默認的構造函數,常用在單例模式中,只允許一個實例的存在的情景下;簡單輔助工具:arraysize,ARRAYSIZE_UNSAFE用以在編譯器獲取到對象數組的大小;類型轉換:implicit_cast作為static_cast或const_cast向上轉型的一個安全版本;編譯期斷言工具:COMPILE_ASSERT,其主要通過內部不可以負數作為數組的索引來判斷;不同類型轉換時按字節轉化:bit_cast,替代reinterpret_cast轉化時的會產生警告提示的情況,bit_cast內部采用memcpy,故可以很快轉化;用在不需要返回返回值卻有返回值的不安全情形:ignore_result,將忽視該返回值,實際上其內部函數體中什么也沒有做;創建靜態指針對象:CR_DEFINE_STATIC_LOCAL,該操作可能會產生內存資源泄露的情況,需要正常處理釋放的操作,可以使用lazy_instance.h中的LazyInstance,可以安全的釋放的資源,具體的原理是:在該靜態類中含有一個靜態的輔助對象,其負責刪除該對象,釋放資源。
build_config.h:主要針對不同的平台定義相應的宏,用以編譯時區分;包括操作系統:windows、mac、linux、POSIX系列,編譯器:MSVC、GCC;以及處理器X86、X64等。
port.h:主要針對不同的編譯器,聲明變量類型長整型、8、16、32、64位符號和無符號整數;在valist中使用前時:GG_VA_COPY,用以判斷該類型是否支持拷貝(內部實際是一個簡單的拷貝操作);在windows下調用API函數的約定方式:API_CALL宏,即__stdcall(參數是從右向左通過堆棧傳遞, 函數調用在返回前要由被調用者清理堆棧)。
以后各模塊排名不分主次,按照字母索引分別進行;下一篇將分析chrominum之allocator分配器,屆時將對其內存管理器jemalloc和tcmalloc進行研究、學習,其中的jemalloc 為BSD的提供的內存分配管理而tcmalloc是google的內存分配管理模塊。