Linux多線程服務端編程:使用muduo C++網絡庫 學習筆記 附錄C 關于Boost的看法

這是作者為電子工業出版社出版的《Boost程序庫完全開發指南》寫的推薦序,此處節選了作者對在C++工程項目中使用Boost的看法。

最近一年(這篇文章寫于2010年8月)作者電話面試了數十位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(注意boost::date_time處理時區和夏令時采用的方法不夠靈活,可以考慮使用muduo::TimeZone)和circular_buffer等等。然后,在新項目中,對于消息傳遞和資源管理可以考慮采用更加現代的方式,例如用function/bind在某些情況下代替虛函數作為庫的回調接口、借助shared_ptr實現線程安全的對象回調等等。這二者會影響整個程序的設計思路與風格,需要通盤考慮,如果正確使用智能指針,在現代C++里一般不需要出現delete語句。最后,對某些性能不佳的庫保持警惕,比如lexical_cast(一個用于在不同數據類型之間進行轉換的通用工具,如將字符串轉換為數字,將數字轉換為字符串,以及其他基本數據類型之間的轉換)。總之,在項目組成員人人都能理解并運用的基礎上,適當引入現成的Boost組件,以減少重復勞動,提高生產力。

試舉一例:正則表達式庫regex對線程安全的處理。早期的RegEx class不是線程安全的,它把“正則表達式”和“匹配動作”放到了一個class里邊。由于有可變數據,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則是class、資源管理、模板編程的絕佳示范。在深入了解STL的實現之后,運用STL自然手到擒來,并能自動避免一些錯誤和低效的用法。

對于Boost也是如此,為了消除使用時的異或,為了用得更順手,有時我們需要適當了解其內部實現,甚至編寫簡化版用作對比驗證。但是由于Boost代碼用到了日常應用程序開發中不常見的高級語法和技巧,并且為了跨多個平臺和編譯器而大量使用了預處理宏,閱讀Boost源碼并不輕松愜意,需要下一番工夫。另一方面,如果沉迷于這些有趣的底層細節而忘了原本要解決什么問題,恐怕就舍本逐末了。

Boost中的很多庫是按泛型編程(generic programming)的范式來設計的,對于熟悉面向對象編程的人而言,或許面臨一個思路的轉變。比如,你得熟悉泛型編程的那套術語,如concept、model、refinement,才容易讀懂Boost.Threads的文檔中關于各種鎖的描述。對于熟悉STL設計理念的人而言,這不是什么大問題。

在某些領域,Boost不是唯一的選擇,也不一定是最好的選擇。比如,要生成公式化的源代碼,坐著寧愿用腳本語言寫一小段代碼生成程序,而不用Boost.Preprocessor(Boost C++庫中的一個組件,旨在提供一組預處理器宏,用于在編譯時生成重復代碼、元編程和其他需要在預處理階段處理的任務);要在C++程序中嵌入領域特定語言,作者寧愿用Lua或其他語言解釋器,而不用Boost.Proto(允許用戶定義自己的表達式語法,以及對應的語法規則和操作。這使得用戶可以根據自己的需求定義符合領域特定需求的表達式語法,從而編寫更加簡潔和易讀的代碼);要用C++程序解析上下文無關文法,作者寧愿用ANTLR(ANother Tool for Language Recognition,一個用于構建語言識別器、解析器和翻譯器的工具)來定義詞法與語法規則并生成解析器(parser),而不用Boost.Spirit(一個用于構建解析器和生成器的工具庫,能夠讓開發者使用C++中的語法進行遞歸下降解析和生成操作)。總之,使用Boost時心態要平和,別較勁去改造C++語言。把它有助于提高生產力的那部分功能充分發揮出來,讓項目從中受益才是關鍵。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/714501.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/714501.shtml
英文地址,請注明出處:http://en.pswp.cn/news/714501.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

十行代碼開發一個AI應用

Semantic Kernal 簡介 Semantic Kernel (SK) is a lightweight SDK that lets you easily mix conventional programming languages with the latest in Large Language Model (LLM) AI "prompts" with templating, chaining, and planning capabilities out-of-the-…

關于vue中關于eslint報錯的問題

1 代碼保存的時候會自動將單引號報錯為雙引號 導致eslint報錯的問題, 解決思路: 在項目根目錄下新建一個.prettierrc.json文件 { “tabWidth”: 2,“useTabs”: false,“singleQuote”: true,“semi”: false} 2 關于報錯代碼的時候 出現尾隨逗號報錯…

Zabbix 系統告警“More than 75% used in the configuration cache”處理辦法

Zabbix系統報錯提示 Zabbix 系統告警“More than 75% used in the configuration cache”,看了一下意思是可用的配置緩存超過75%。 修改緩存大小 vim /etc/zabbix/zabbix_server.confesc : /CacheSize 找到配置 將64M改大一點,保存退出。 重啟zabbix…

WPF常用mvvm開源框架介紹 vue的mvvm設計模式鼻祖

WPF(Windows Presentation Foundation)是一個用于構建桌面應用程序的.NET框架,它支持MVVM(Model-View-ViewModel)架構模式來分離UI邏輯和業務邏輯。以下是一些常用的WPF MVVM開源框架: Prism Prism是由微軟…

代碼隨想錄算法訓練營 Day32 | LeetCode122.買賣股票的最佳時機II、LeetCode55. 跳躍游戲、LeetCode45.跳躍游戲II

LeetCode122.買賣股票的最佳時機II 那么這里面根據貪心思想: 1、在最低點時買入,如果該點比上一點價格更低,只有兩種情況:上一點為買入點,則此時更新買入點;上一點不是買入點,則此時將股票賣出…

物聯網的核心技術有哪些?

物聯網的核心技術有哪些? 說起物聯網的相關技術,涉及到很多,比如自動識別技術、傳感器技術、網絡通信技術、云計算等,但說到核心技術,我認為有以下6個。這6個核心技術分別是感知和識別技術、物聯網設備硬件、通信技術、數據處理技…

【MySQL】數據庫中常用的函數

目錄 聚合函數COUNT()函數的多種用法COUNT(*)COUNT(主鍵)COUNT(1)COUNT(常量)COUNT(非主鍵)COUNT(distinct(字段)) COUNT()函數小結 字符函數length(str)函數:獲取參數值的字節個數concat(str1,str2,...)函數:字符串拼接upper(str)、lower(str)函數:大小…

Linux高負載排查最佳實踐

在Linux系統中,經常會因為負載過高導致各種性能問題。那么如何進行排查,其實是有跡可循,而且模式固定。 本次就來分享一下,CPU占用過高、磁盤IO占用過高的排查方法。 還是那句話,以最佳實踐入手,真傳一句話…

1 開源鴻蒙OpenHarmony niobe407 STM32F407IGT6芯片輕型系統全量源碼4.1版本下載流程

開源鴻蒙OpenHarmony niobe407 STM32F407IGT6芯片輕型系統全量源碼4.1版本下載流程 作者將狼才鯨日期2024-02-27 一、前景提要 如果通過DevEco Marketplace網站獲取下載源碼的話,不全,有些板子下不到;OpenHarmony開發板列表,官方…

數據庫-第二/三章 關系數據庫和標準語言SQL【期末復習|考研復習】

前言 總結整理不易,希望大家點贊收藏。 給大家整理了一下計數據庫系統概論中的重點概念,以供大家期末復習和考研復習的時候使用。 參考資料是王珊老師和薩師煊老師的數據庫系統概論(第五版)。 文章目錄 前言第二、三章 關系數據庫和標準語言SQL2.1 關系2…

JVM原理-基礎篇

Java虛擬機(JVM, Java Virtual Machine)是運行Java應用程序的核心組件,它是一個抽象化的計算機系統模型,為Java字節碼提供運行環境。JVM的主要功能包括:類加載機制、內存管理、垃圾回收、指令解釋與執行、異常處理與安…

React react.fragment和<>的使用及區別

React一個常用的模式是組件返回多個元素。Fragment可以為你的子元素分組而不需要在DOM上為它們添加額外的節點。 Fragment 使用 render() {return (<React.Fragment> <ChildA /> <ChildB /> <ChildC /> </React.Fragment> );}短語法使用 這里…

虛擬機內存不夠用了?全流程操作Look一下?

虛擬機信息&#xff1a;操作系統&#xff1a;CentOS Linux 7 (Core)&#xff0c;用的是VMware Workstation 16 Pro 版本16.2.3 build-19376536&#xff1b;我的主機 Windows 10 Education, 64-bit (Build 22000.1817) 10.0.22000 前言&#xff1a;虛擬機用久了就會出現內存不足…

代碼隨想錄算法訓練營Day37|738.單調遞增的數字、968.監控二叉樹

738.單調遞增的數字 題目鏈接&#xff1a;738.單調遞增的數字 文檔鏈接&#xff1a;738.單調遞增的數字 視頻鏈接&#xff1a;貪心算法&#xff0c;思路不難想&#xff0c;但代碼不好寫&#xff01;LeetCode:738.單調自增的數字 C實現 class Solution { public:int monotoneIn…

Rocky Linux 安裝部署 Zabbix 6.4

一、Zabbix的簡介 Zabbix是一種開源的企業級監控解決方案&#xff0c;用于實時監測服務器、網絡設備和應用程序的性能和可用性。它提供了強大的數據收集、處理和可視化功能&#xff0c;同時支持事件觸發、報警通知和自動化任務等功能。Zabbix易于安裝和配置&#xff0c;支持跨平…

6、Redis-KV設計、全局命令和安全性

目錄 一、value設計 二、Key設計 三、全局命令——針對所有key 四、安全性 一、value設計 ①是否需要排序&#xff1f;需要&#xff1a;Zset ②需要緩存的數據是單個值還是多個值&#xff1f; 單個值&#xff1a;簡單值---String&#xff1b;對象值---Hash多個值&#x…

【前端素材】推薦優質后臺管理系統網頁Hyper平臺模板(附源碼)

一、需求分析 1、系統定義 后臺管理系統是一種用于管理和控制網站、應用程序或系統的管理界面。它通常被設計用來讓網站或應用程序的管理員或運營人員管理內容、用戶、數據以及其他相關功能。后臺管理系統是一種用于管理網站、應用程序或系統的工具&#xff0c;通常由管理員使…

【AIGC】OpenAI推出王炸級模型sora,顛覆AI視頻行業(2024)

對于OpenAI推出的Sora模型&#xff0c;我們可以進一步探討其可能的技術細節、潛在應用以及對AI視頻行業的影響。 點擊以下任一云產品鏈接&#xff0c;跳轉后登錄&#xff0c;自動享有所有云產品優惠權益&#xff1a; 經過筆者親測&#xff0c;強烈推薦騰訊云輕量應用服務器作…

【分類討論】【割點】1568. 使陸地分離的最少天數

作者推薦 動態規劃的時間復雜度優化 本文涉及知識點 分類討論 割點 LeetCode1568. 使陸地分離的最少天數 給你一個大小為 m x n &#xff0c;由若干 0 和 1 組成的二維網格 grid &#xff0c;其中 1 表示陸地&#xff0c; 0 表示水。島嶼 由水平方向或豎直方向上相鄰的 1 …

接口詳細說明

接口概述 接口也是一種規范 接口的定義與特點 接口的格式如下&#xff1a; //接口用關鍵字interface來定義 public interface 接口名 {// 常量// 抽象方法 } JDK8之前接口中只能是抽象方法和常量&#xff0c;沒有其他成分了。 接口不能實例化。 接口中的成員都是public修…