Boost 和 STL 相比有哪些優點和劣勢?

1. 在設計原則上,STL和Boost大致統一
由於STL和Boost基本上都是標準委員會那批人在策劃、審覈和維護,因此口味上是相對接近的。
可是由於Boost並不在標準中,或者說是下一代標準的試驗場,因此庫的種類要更多一些,手法也更加豐富一些。

2. STL/Boost 針對 Developer 和 User 的要求不一樣
對於Boost開發者而言,強調的是代碼可讀、高效、強調元編程和編程技巧。程序員

補註:評論裏面果真有人提到說可讀性和元編程有矛盾。這種說法大概相似於「這段代碼可讀性差是由於業務太複雜」。這是不對的。可讀性是要創建在正確的知足功能和性能的基礎上的。這也是爲何我要特別爲後兩點解(Jiao)釋(Bian)一下。


這裏要解釋一下後兩點:編程

  • 編程技巧主要是爲了實現一些看起來有點像天方夜譚的功能,例如C++11以前的Boost.Auto(利用了編譯器的Bug或者特性);以及1.56才加入的TypeIndex,該宏利用了編譯器能產生Mangled/Demangled函數簽名的能力。
  • 元編程主要是爲了解決三個問題:
    • 增長宏/模板演算的能力,爲圖靈完備的模板編程提供類型/常量運算的庫,方便開發者。例如Boost.MPL和Boost.PP;
    • 增長C++的語言內描述能力,也就是Embedded DSL。例如Spirit和Proto,都是很好的例子;
    • 作儘量多的靜態檢查。好比Boost.Chrono將單位綁定到類型中,解決了單位轉換容易出錯的問題。

而STL由於處於標準中,因此會對不一樣平臺的編譯器都作出了統一要求,須要編譯器配合的地方,也不會用語言機制或者奇技淫巧來遷就,例如Static Assertion、Auto、decltype,在Boost當中是以必定的技巧實現的(由於編譯器不能直接支持),而在C++11種就變成了一個內置的語言特性。與此相似的還有不少的Type Traits。

對於User而言,Boost/STL的庫能夠分爲四種風格。網絡

  • 第一種風格爲Lib風格,以提供功能爲主,使用方法通常也就是as-is。例如Pool,Graph,Interval,Chrono,ASIO等。它們的接口使用也能夠分爲兩個部分,第一階段是型別特化,第二階段是基於運行時接口。STL和Boost裏,大部分庫都是這樣的風格。這也是最容易使用和使用頻率最高的風格。
  • 第二種風格是語法糖類。Boost.Foreach等都屬於這一類。可是在STL中就很是罕見,由於語言已經獲得了充分升級。
  • 第三種風格是範式和方法論的拓展,即在C++中模擬其餘編程範式和方法論。例如spirit,lambda,proto。嚴格的說,boost.mpl也能夠歸屬此類。這一類庫的使用方式分爲兩步,第一步是定製方言,第二步是使用方言。這類應用由於面向庫的開發者,因此STL中很難見。
  • 第四類風格,是元編程。利用模板和宏進行編譯器推導,以實現代碼展開、選擇編譯等工做。典型的例子有Boost.PP,STL/Boost.TypeTraits,enable_if等,這一部分對於通常用戶是能夠不用的。STL中有部分基礎的元編程支持(例如Traits)。

由於STL多數是面向通常程序員,因此以第一種庫居多,而Boost包含了所有四類的庫的風格。

3. 文檔
Boost的文檔基本上是tutorial風格的,Reference作的並很差。而被標準化的STL一般會有更加清晰易讀的Reference。

4. 平臺特定性
Boost有不少支持不一樣平臺、或者IO相關的玩意兒,好比Boost.Process,GIL,ASIO,Context,哪一個都不是平臺無關的省油燈。反觀STL對這方面一直都很保守,以前一直就只有容器這類東西,C++11以後才把Thread、File System這種和平臺有些關係的內容陸續給弄進來,IO和網絡到如今都是一塊愛財如命的荒地。

5. 問題
Boost和STL的問題幾乎是相通的,就是由於模板使用多,編譯時間較長,二進制也相對較大。編譯錯誤也不是很是明確。Boost中一些元編程份量更多的庫,例如MSM和Spirit的問題要更加嚴重。
此外,由於Boost是試驗性質的庫,因此接口可能不是很是穩定。而一旦庫進入STL以後,就幾乎不可能有變化了。好比Boost.Filesystem在進入TR2以前,前後有三個比較大版本的API變更;Spirit也作出了一次比較大的調整。
還有就是,Boost的庫和其它語言的標準庫相比,零散雜亂,我常常也忘記Boost/STL中的某些庫,本身去發明了一個一點都很差用的輪子。

6. 乾兒子
最後就是,雖然Boost是標準委員會的乾兒子,可是也不保證它的實現就必定是進入STL。好比網絡庫,最後進標準的,應該是CppNetlib,而不是ASIO。函數

 

 

references:性能

http://www.zhihu.com/question/27558334設計

相關文章
相關標籤/搜索