Boost 是一個功能強大、構造精巧、跨平台、開源並且完全免費的 C++ 程式庫。
1998 年,Beman G.Dawes(C++標準委員會成員之一)發起倡議並建立了 Boost 社群,其目的是向 C++ 程式設計師提供免費的、經同行審查的、可移植的、高品質的 C++ 源程式庫。
Boost 強調程式庫要與 C++ 標準庫很好地共同工作,建立在“既有的實踐”之上並提供參考實現,因此 Boost 庫可以適合最後的標準化。
自創立以來,Boost 社群的工作已經取得了卓越的成果,C++ 標準庫中有三分之二來自 Boost 庫,而且將來 Boost 庫中還會有更多的庫進入新標準。
C++ 四十餘年的發展歷史中產生了數不清的程式庫,有影響力的程式庫也不計其數,然而其中沒有一個程式庫能夠與 Boost 相提並論,Boost 有著其他程式庫無法比擬的優點,具體如下:
1) 許多 Boost 庫的作者本身就是 C++ 標準委員會成員,因此,Boost“天然”成了標準庫的後備,負責向新標準輸送元件,這也使得 Boost 獲得了“準”標準庫的美譽。
2) Boost 獨特的同行審查制度保證了每一個 Boost 庫元件都經過了嚴格的審查和驗證,使其具有很高的工業強度,甚至超過大多數商業產品的實現。
3) Boost 採用了類似 STL 的程式設計正規化,但卻並沒有 STL 那樣晦澀難懂,其程式碼格式優美清晰、易於閱讀,而且 Boost 附帶豐富的說明文件——它既是一個程式庫,也是一個很有價值的學習現代 C++ 程式設計的範本。
4) Boost 的發布採用 Boost Software License,這是一個不同於 GPL 和 Apache 的非常寬鬆的許可證,該許可證允許庫使用者將 Boost 用於任何用途,既鼓勵非商業用途,也鼓勵商業用途。使用者無須支付任何費用,不受任何限制,即可輕鬆享有 Boost 的全部功能。
Boost 官方於 2019 年 12 月發布的 1.72 版本,共包含 160 餘個庫/元件,涵蓋字串與文字處理、容器、疊代器、演算法、影象處理、模板超程式設計、並行程式設計等多個領域,使用 Boost,將大大增強 C++ 的功能和表現力。
獲取 Boost
Boost 提供原始碼形式的安裝包,可以從 Boost 官方網站(https://www.boost.org/)下載最新版本。以 boost_1_72_0.tar.gz 為例,把該檔案解壓縮到磁碟任意位置即可,例如:
tar xvfz boost_1_72_0.tar.gz #解壓縮到當前目錄
Boost 的目錄結構
Boost 壓縮包解壓後有5萬多個檔案,占據近 700MB 的磁碟空間,但其目錄結構卻很簡潔清晰:
boost_1_72_0/ #存放設定指令碼和說明檔案
├──── boost #最重要的目錄,90%以上的Boost程式庫原始碼都在這裡
├──── doc #HTML格式的文件,也可以生成PDF格式的文件
├──── libs #所有元件的範例、測試、編譯程式碼和說明文件
├──── more #庫作者的相關文件
├──── status #可用於測試Boost庫的各個元件
└──── tools #b2、quickbook 等自帶工具
在大多數情況下,我們只需要關心 boost 子目錄,這裡面以標頭檔案的形式分門別類地存放了我們要使用的庫程式碼:
boost_1_72_0/ #Boost 安裝根目錄
├──── boost #boost子目錄
│ ├──── accumulators #累加器庫
│ ├──── algorithm #演算法庫
│ ├──── align #記憶體對齊庫
│ ├──── archive #序列化庫
│ ├──── asio #非同步並行庫
│ ├──── assign #賦值初始化庫
│ ├──── atomic #原子操作庫
│ ├──── beast #高階網路通訊庫(HTTP/WebSocket)
│ ├──── bimap #雙向關聯陣列
│ ├──── bind #bind表示式
│ ├──── chrono #時間處理庫
│ ├──── ... #其他庫……
│ └──── yap #表示式模板庫
Boost 使用方式
Boost 庫的大多陣列件不需要編譯連結,我們在自己的原始碼裡直接包含標頭檔案即可。例如,如果要使用 boost::tribool,只需要在 C++ 原始檔中新增如下 include 語句:
#include <boost/logic/tribool.hpp> //使用tribool庫
細心的讀者會發現,Boost 庫的標頭檔案與我們平常所用的標頭檔案(*.h)或 C++ 標準庫的標頭檔案(沒有字尾名)不同,這正是 Boost 的獨特之處。它把 C++ 類的宣告和實現放在了一個檔案中,而不是分成兩個檔案,即
.h+.cpp
,故檔案的字尾是
.hpp
。
之所以這麼做當然是有理由的。其中一個原因就是與普通的C標頭檔案(*.h)區分,另一個很重要的原因就是使 Boost 庫不需要預先編譯,直接將其引入程式設計師的工程即可編譯連結,方便了 Boost 庫的使用。
Java、C#、PHP、Python 程式設計師應該對這種程式碼檔案形式很熟悉,這幾種語言都在一個檔案中編寫所有程式碼。
剩下的少量庫(如 chrono、date_time、program_options、test、thread 等)必須編譯成靜態庫或動態庫,並在構建時指定連結選項才能使用。
不過有個好訊息,其中有的庫不需要編譯也可以使用部分或全部功能,而更好的訊息是有的庫已經有了不需要編譯的替代品。