Google之Chromium瀏覽器源碼學習——base公共通用庫(一)

  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;linux

  因學習須要暫不先站在考慮高層次的角度,如設計模式、模型、線程進程等通訊交互細節;只是做爲初學者或是本人學習記錄,從底層細節瞭解整個谷歌的Chromium源,後期將逐步學習高層次內容;此外google源碼風格也是能夠借鑑的,具體採用的編程、源碼風格可根據自身愛好或是公司內部要求進行制定。編程

  拿到Chromium代碼後,你會發現有不少頂級目錄,其中的base庫:爲全部子工程共用的通用代碼。它包括字符串操做、文件、線程、消息、內存管理等通用庫,做爲其餘全部頂層工程間共用的東西。感興趣的能夠從中抽取該base庫單獨研究或是應用到本身的項目中,做爲可用的公共庫部分也是個不錯的作法。因該工程內部內容比較零散,咱們將按照模塊劃分的方式來了解、學習;先羅列其餘文件依賴的最最基礎的文件,而後針對各模塊詳細分析、學習。windows

  base_export.h:主要用以對不一樣的平臺定義了導入和導出庫相關的宏:BASE_EXPORT;該類宏將貫穿整個base庫。設計模式

  basictypes.h:主要根據不一樣平臺的支持聲明定義變量類型的簡單別名如typedef int  int32等;各類經常使用類型最大最小值變量定義(八、1六、3二、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;以及處理器X8六、X64等。瀏覽器

  port.h:主要針對不一樣的編譯器,聲明變量類型長整型、八、1六、3二、64位符號和無符號整數;在valist中使用前時:GG_VA_COPY,用以判斷該類型是否支持拷貝(內部實際是一個簡單的拷貝操做);在windows下調用API函數的約定方式:API_CALL宏,即__stdcall(參數是從右向左經過堆棧傳遞, 函數調用在返回前要由被調用者清理堆棧)。安全

  之後各模塊排名不分主次,按照字母索引分別進行;下一篇將分析chrominum之allocator分配器,屆時將對其內存管理器jemalloc和tcmalloc進行研究、學習,其中的jemalloc 爲BSD的提供的內存分配管理而tcmalloc是google的內存分配管理模塊less

相關文章
相關標籤/搜索