【轉】Header Only Library的介紹


Header Only Library把一個庫的內容完全寫在頭文件中,不帶任何cpp文件. 這是一個巧合,決不是C++的原始設計.

第一次這么做估計是STL.在80年代末C++編譯器還不支持模塊分離(現在也不支持,以后估計也不會支持了), STL的作者不得不把模板的實現寫在頭文件中, 使得一個STL庫的實現絕大部分都展示給了使用者.

第一次廣泛被接受估計還是在Boost庫,它不只提出使用hpp做為Header Only Library的文件后綴(因為這些頭文件再也不能用於C語言了),還把一些原本不是Header Only的庫變成了Header Only.

拋開一些外部約束不談,Header Only Library有自己的優點:Header Only Library - Wikipedia benefits of header only libraries - stackoverflow

1.輕量級編譯流程,集成編譯非常簡單,只需要指明所在路徑,在C++實現文件中包含所需頭文件即可.
2.編譯器優化可以做得更好.因為內聯函數和所有的實現都在編譯時可見,所以可以進行相當多的優化,包括一些全局優化.
3.更好的代碼設計.因為不能使用寫全局變量和靜態變量,以及所有的代碼都公開可見,使得很多不良設計都無處藏身.
4.減少了ABI接口變更的風險.部分編譯選項會導致靜態庫/動態庫的ABI變化或者行為變化,庫的作者需要提供多個版本的庫文件, 包括但不限於32/64bit, 靜態/動態庫, struct layout等不同組合.
Header Only規避了這個問題.

當然它的缺點也很明顯.

1.變更會導致全部組件重新編譯.這就要求Header Only Library盡量應為相對穩定的功能庫,而不是做為接口庫.
2.代碼組織不合理時,編譯時間會顯著變長.大量使用Header Only Library需要合量划分編譯單元,減少編譯單元的數量
可以有效提高編譯速度.就我的實踐來看每個編譯單元應大於1萬行(不包括頭文件).boost separated source

Header Only Library常被誤解會導致編譯后代碼變大. 因為Header Only Library大量使用模板技術, 以增加靈活性,
模板是會一定程度上增加編譯結果的大小. 排除這一點, Header Only Library不會導致編譯后代碼明顯變大.原因主
要是編譯器的優化起作用.Benchmards - Stackoverflow

  1. 大量的內聯會增加代碼編譯的結果.
  2. 按需實例化會減少不用的代碼鏈接到代碼中.
  3. 死代碼發現機制,會減少一部分不使用的代碼.

如何創建Header Only Library

首先應選一個名字空間,比如 work4me,建議使用全小寫,最好與web domain相同. 頭文件中所有類,常量,函數,模板,枚舉以及聯合
都應在這個名字空間之內聲明. 頭文件也應放在同名目錄之內, 且使用hpp做為后綴.

頭文件中除了命名空間以外,只能包括:

  • 類/枚舉/聯合的聲明和定義
  • 常量/常量表達式的聲明和定義
  • 類模板,函數模板定義
  • typedef和using產生的名字.
  • 內聯函數和內聯成員函數的定義

建議提供一個fwd.hpp來放置所有模板的前置聲明, 以及一些函數和函數模板的前置聲明. 因為如果在模板聲明中用到默認參數,用戶就沒有
辦法寫自己的模板前置聲明.(默認模板參數只能在第一次聲明時指定,且只能指定一次,那怕各處都保持一致也會編譯失敗).

特別需要注意所有函數定義,都需要加上inline關鍵字.

不能使用static定義任何全局的變量和函數.不能定義類的static變量成員,但可以定義內聯的static成員函數.

不能使用匿名命名空間.如果需要向用戶隱藏一些接口或類型,可以使用details/impl等表示實現的嵌套命名空間.

如果依賴標准庫以外的第三方庫,應在ReadMe中做出說明.

如果依賴平台庫比如windows.h/pthread.h等平台專有庫,可以考慮bridge模式把這實現部分放到win32,linux等嵌套命名空間下.

什么時候適用

Header Only Library適合通用類庫,因為需求變動不大,對靈活性和效率要求較高.包括boost內這些語言工具,基礎算法,基礎工具.
不適合功能性比較強,需要減少耦合的地方.比如一些正交的功能模塊.

做為折中,可以把功能模塊本身寫成Header Only Library,但使用一個編譯單元把它與其它部分隔離.常用的隔離技術比如PIMPL可以在這里使用.

 

==============================================

本文轉載於http://www.cnblogs.com/ahuangliang/p/cxx-practices-header-only-library.html

作者黃亮


免責聲明!

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



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