深入C 「準」標準庫,Boost你的力量

2022-04-07 08:38:02 字數 2471 閱讀 1516

最近一年我**面試了數十位 c++ 應聘者,慣用的暖場問題是「工作中使用過 stl 的哪些元件?使用過 boost 的哪些元件?」。得到的答案大多集中在 vector、map 和 shared_ptr。如果對方是在校學生,我一般會問問 vector 或 map 的內部實現、各種操作的複雜度以及迭代器失效的可能場景。如果是有經驗的程式設計師,我還會追問 shared_ptr 的執行緒安全性、迴圈引用的後果及如何避免、weak_ptr 的作用等。如果這些都回答得不錯,進一步還可以問問如何實現執行緒安全的引用計數,如何定製刪除動作等等。這些問題讓我能迅速辨別對方的 c++ 水平。

我之所以在面試時問到 boost,是因為其中的許多元件確實可以用於編寫可維護的產品**。boost 包含近百個程式庫,其中不乏具有工程實用價值的佳品。每個人口味與技術背景不一樣,對 boost 的取捨也不一樣。就我的個人經驗而言,首先可以使用絕對無害的庫,例如 noncopyable、scoped_ptr、static_assert 等,這些庫的學習和使用都比較簡單,容易入手。其次,有些功能自己實現起來並不困難,正好 boost 裡提供了現成的**,那就不妨一用,比如date_time 和 circular_buffer 等。然後,在新專案中,對於訊息傳遞和資源管理可以考慮採用更加現代的方式,例如用 function/bind 在某些情況下代替虛函式作為庫的**介面、借助shared_ptr實現執行緒安全的物件**等等。這二者會影響整個程式的設計思路與風格,需要通盤考慮,如果正確使用智慧型指標,在現代 c++ 程式裡一般不需要出現 delete 語句。最後,對某些效能不佳的庫保持警惕,比如 lexical_cast。總之,在專案組成員人人都能理解並運用的基礎上,適當引入現成的 boost 元件,以減少重複勞動,提高生產力。

早期的 regex 類不是執行緒安全的,它把「正規表示式」和「匹配動作」放到了乙個類裡邊。由於有可變資料,regex 的物件不能跨執行緒使用。如今的 regex 明確地區分了不可變(immutable)與可變(mutable)的資料,前者可以安全地跨執行緒共享,後者則不行。比如正規表示式本身(basic_regex)與一次匹配的結果(match_results)是不可變的;而匹配動作本身(match_regex)涉及狀態更新,是可變的,於是用可重入的函式將其封裝起來,不讓這些資料洩露給別的執行緒。正是由於做了這樣合理的區分,regex 在正常使用時就不必加鎖。

donald knuth 在「coders at work」一書裡表達了這樣乙個觀點:如果程式設計師的工作就是擺弄引數去呼叫現成的庫,而不知道這些庫是如何實現的,那麼這份職業就沒啥樂趣可言。換句話說,固然我們強調工作中不要重新發明輪子,但是作為乙個合格的程式設計師,應該具備自製輪子的能力。非不能也,是不為也。

c/c++ 語言的一大特點是其標準庫可以用語言自身實現。c 標準庫的 strlen、strcpy、strcmp 系列函式是教學與練習的好題材,c++ 標準庫的 complex、string、vector 則是類、資源管理、模板程式設計的絕佳示範。在深入了解 stl 的實現之後,運用 stl 自然手到擒來,並能自動避免一些錯誤和低效的用法。

對於 boost 也是如此,為了消除使用時的疑慮,為了用得更順手,有時我們需要適當了解其內部實現,甚至編寫簡化版用作對比驗證。但是由於 boost **用到了日常應用程式開發中不常見的高階語法和技巧,並且為了跨多個平台和編譯器而大量使用了預處理巨集,閱讀 boost 原始碼並不輕鬆愜意,需要下一番功夫。另一方面,如果沉迷於這些有趣的底層細節而忘了原本要解決什麼問題,恐怕就捨本逐末了。

boost 中的很多庫是按泛型程式設計的正規化來設計的,對於熟悉物件導向程式設計的人而言,或許面臨乙個思路的轉變。比如,你得熟悉泛型程式設計的那套術語,如concept、model、refinement,才容易讀懂 boost.threads 的文件中關於各種鎖的描述。我想,對於熟悉 stl 設計理念的人而言,這不是什麼大問題。

在某些領域,boost 不是唯一的選擇,也不一定是最好的選擇。比如,要生成公式化的源**,我會首選用指令碼語言寫一小段**生成程式,而不用 boost.preprocessor;要在 c++ 程式中嵌入領域特定語言,我會首選用 lua 或其他語言直譯器,而不用 boost.proto;要用 c++ 程式解析上下文無關文法,我會首選用 antlr 來定義詞法與語法規則並生成解析器(parser),而不用 boost.spirit。總之,使用 boost 時心態要平和,別較勁去改造 c++ 語言。把它有助於提高生產力的那部分功能充分發揮出來,讓專案從中受益才是關鍵。

要學習 boost,除了閱讀其官方**的文件、示例與原始碼之外,最好能有一本比較全面的中文書在手邊隨時翻閱。對於不諳英文的開發者,這更是可幸之至。您手上這本《boost 程式庫完全開發指南》是很好的使用指南與參考手冊。作者由淺入深地介紹了 boost 的大部分常用內容,能讓讀者迅速了解 boost,並從中找到自己需要的部分。拿到這本書稿之後,我有粗有細地閱讀了一遍,總體來看,作者水平很高,也相當務實,對 c++ 和 boost 的理解與運用很到位,我從這本書學到了不少新知識。為此,我樂於向希望學習 boost 程式庫的開發者推薦這本靠譜的書。

須知「功不唐捐」,作為一名現代 c++ 程式設計師,在 boost 上投入的精力定能獲得回報。

陳碩《**大全》譯者之一

2023年8月於中國•香港

準標準庫Boost

在c 中,庫的地位是非常高的。c 之父 bjarne stroustrup先生多次表示了設計庫來擴充功能要好過設計更多的語法的言論。現實中,c 的庫門類繁多,解決的問題也是極其廣泛,庫從輕量級到重量級的都有。不少都是讓人眼界大開,亦或是望而生嘆的思維傑作。由於庫的數量非常龐大,而且限於筆者水平,其中...

C 各大有名庫的介紹 準標準庫Boost

c 各大有名庫的介紹 準標準庫boost boost庫是乙個經過千錘百鍊 可移植 提供源 的c 庫,作為標準庫的後備,是c 標準化程序的發動機之一。boost庫由c 標準委員會庫工作組成員發起,在c 社群中影響甚大,其成員已近2000人。boost庫為我們帶來了最新 最酷 最實用的技術,是不折不扣的...

《超越C 標準庫 Boost庫導引》 目錄

序 foreword 前言 preface 致謝 acknowledgments 關於作者 about the author 本書的組織結構 anization of this book boost 庫簡介 introduction to boost string and text processi...