標籤:

你讀過的最好的 C++ 開源代碼是什麼?


Facebook的開源基礎庫Folly(GitHub - facebook/folly: An open-source C++ library developed and used at Facebook.) 還是非常值得看的。這是Facebook內部廣泛使用的可重複C++庫組件大集合。也是最近幾年C++領域難得的高質量庫。

一方面,Folly直接採用C++ 11新標準,在coding guidelines、best practices 方面Folly做了一個榜樣。

另一方面,Folly對大規模高性能有很多支持,可謂這方面的基礎庫標杆。雖然STL BOOST性能已經上乘,但能有Folly這樣對large-scale 的軟體 performance近乎變態的追求的,還是比較少見,而且顯然是industry-level的。在這方面是對STL與BOOST的有效補充。

另外,不得不提一下,領導Folly庫的核心人物是C++社群的大神Andrei Alexandrescu,玩過C++的朋友,應該都知道Andrei的鼎鼎大名。《Modern C++ Design》,和Jolt大獎圖書《C++ Coding Standards》的作者。開創了Modern C++ 代碼風格的鼻祖。也是D語言之父。

最後,順便做一個 推薦,大神Andrei Alexandrescu和C++之父將出席 10月28-29日在上海舉辦的「

2016 C++及系統軟體技術大會, Andrei Alexandrescu 本人將有精彩演講。並在會前10月27日有一個高幹貨的培訓:《大規模系統軟體性能優化》高端培訓,感興趣的朋友可以看看。


大家說的很多是庫,我也來推薦一個實際的工程項目 Qt Creator,輕量級的IDE .

代碼質量是非常高的,由諾基亞發起(沒記錯的話…),讀代碼有如下優勢:

1.完整的IDE

3.架構

2.插件系統,各個插件如何配合等

3.設計模式,非常多的模式,我見過工廠,單類等等

4.如何寫跨平台代碼

5.Qt的方方面面,各種Qt內部類的寫法

6.與其他平台的整合 Android, Remote Linux等

7.工具整合 gcc gdb等

8.自帶一個cpp語法分析器

9.UI編輯工具

其他想到再寫…

鏈接 https://qt.gitorious.org/qt-creator


  • LevelDb

LevelDb是谷歌兩位大神級別的工程師發起的開源項目,簡而言之,LevelDb是能夠處理十億級別規模Key-Value型數據持久性存儲的C++ 程序庫。

鏈接:google/leveldb · GitHub

  • SGI STL

SGI STL是STL代碼的經典實現版本,雖然很多編譯器不直接使用這個版本,但是很多卻在此基礎之上進行改進的。比如GNU C++的標準庫就是在此基礎之上改進的。這份代碼還有一個好處是有注釋,代碼書寫非常規範,只要花些時間讀懂它並非難事。

源碼:Download STL source code

  • Boost.Asio

它是非同步輸入輸出的核心。 名字本身就說明了一切:Asio 意即非同步輸入/輸出。該庫可以讓 C++ 非同步地處理數據,且平台獨立。非同步數據處理就是指,任務觸發後不需要等待它們完成。相反,Boost.Asio 會在任務完成時觸發一個應用。非同步任務的主要優點在於,在等待任務完成時不需要阻塞應用程序,可以去執行其它任務。

鏈接:Boost.Asio - 1.58.0

  • Tinyhttpd

tinyhttpd是一個超輕量型Http Server,使用C語言開發,全部代碼只有502行(包括注釋),附帶一個簡單的Client,可以通過閱讀這段代碼理解一個 Http Server 的本質。

下載鏈接:https://github.com/EZLippi/Tinyhttpd

  • cJSON

cJSON是C語言中的一個JSON編解碼器,非常輕量級,C文件只有500多行,速度也非常理想。

cJSON也存在幾個弱點,雖然功能不是非常強大,但cJSON的小身板和速度是最值得讚賞的。其代碼被非常好地維護著,結構也簡單易懂,可以作為一個非常好的C語言項目進行學習。

項目主頁:cJSON | SourceForge.net

  • Libevent

libevent是一個開源的事件驅動庫,基於epoll,kqueue等OS提供的基礎設施。其以高效出名,它可以將IO事件,定時器,和信號統一起來,統一放在事件處理這一套框架下處理。基於Reactor模式,效率較高,並且代碼精簡(4.15版本8000多行),是學習事件驅動編程的很好的資源。

下載鏈接:GitHub - libevent/libevent

  • Webbench

Webbench是一個在linux下使用的非常簡單的網站壓測工具。它使用fork()模擬多個客戶端同時訪問我們設定的URL,測試網站在壓力下工作的性能,最多可以模擬3萬個並發連接去測試網站的負載能力。Webbench使用C語言編寫, 代碼實在太簡潔,源碼加起來不到600行。

下載鏈接:https://github.com/EZLippi/WebBench

  • Memcached

Memcached 是一個高性能的分散式內存對象緩存系統,用於動態Web應用以減輕資料庫負載。它通過在內存中緩存數據和對象來減少讀取資料庫的次數,從而提供動態資料庫驅動網站的速度。Memcached 基於一個存儲鍵/值對的 hashmap。Memcached-1.4.7的代碼量還是可以接受的,只有10K行左右。

下載地址:memcached - a distributed memory object caching system

  • SQLite

SQLite是一個開源的嵌入式關係資料庫,實現自包容、零配置、支持事務的SQL資料庫引擎。 其特點是高度便攜、使用方便、結構緊湊、高效、可靠。足夠小,大致3萬行C代碼,250K。

下載地址:SQLite Home Page 。

這個網站整理的比較全,可以看看值得推薦的C/C++框架和庫


Qt、、

Qt的代碼只是部分針對性的讀了些、、太優雅了、、

很多設計也很給力、、

試著讀過STL,結果本領不夠,看那麼多模版崩潰了、、、


LevelDB (LevelDB.org)

理由如下:

  1. Google出品,遵循Google C++編碼規範。
  2. 作者是Jeff Dean大神。
  3. 涉及查找、緩存、文件讀寫、多線程、跨平台等諸多常見問題。
  4. 最新版本1.15.0代碼量也不到2萬行。
  5. 基礎的key-value資料庫,廣泛用於Google內部和許多開源項目。


說個比較冷門的,foobar2000 sdk的代碼。


推薦Ogre,拋開性能等問題不說,作為開源渲染引擎,代碼非常規範,框架清晰

短小如tinyxml,其結構也是非常明了,一看就明白

Boost就不多說了,大部分庫還是寫的非常明白的


gaclib


我唯一主動看過別人的代碼的其實是劉未鵬寫的boost代碼解析了。因為我剛開始學編程的時候,中國的網路環境都還相當惡劣,所以幾乎都是看書學。而且我們知道大部分書裡面的代碼都是很爛的,在入了門之後根本沒法看。到了後來,我已經養成了習慣,不主動看別人的代碼了。

當然這並不意味著我不看代碼,因為在別人的博客啊,論文啊,還是一些書裡面,仍然可以看到一些代碼。我最喜歡讀的是Haskell的代碼,每次看一個新的代碼都可以讓我學到新的概念。我們組有一個在微軟幹了二十幾年的老外說過,architectures are patterns。這說的一點都沒錯,只要你大腦裡面有了大量的pattern,再加上你的智商比較高(也就是pattern matching比較快),那解決大部分問題都是很迅速的。


The LLVM Compiler Infrastructure Project 榮獲 ACM 2012 Software System Award.

我們要相信沒有人比寫 C++ 編譯器的更了解 C++ 了

LLVM 自製了許多通用的數據結構,相對於標準的做了很多優化,值得學習:

  • LLVM Programmer』s Manual

LLVM 也有自己的一套代碼規範:

  • LLVM Coding Standards


個人比較喜歡google系的開源代碼


我學習C++的路線比較曲折:早年光顧著看書,C++ Primer和那本很厚的C++標準庫之類的大書,後來反省C++之後就接觸的很少了。

接觸過的C++項目中,印象比較深刻的侯捷在STL源碼剖析中介紹SGI版本的STL,用侯捷自己的話說,大部分C++程序員的代碼比這個差距還是很大。如果你準備學習C++和數據結構演算法,可以結合這本書看看STL的做法,常用的都有了。

後來由於接觸到遊戲UI的緣故接觸了CEGUI這個開源的遊戲UI框架,看的不多,但是感覺層次,模式架構什麼的都不錯,無疑現在做UI這方面C++還是比較合適的。

我心目中寫的好的C++代碼,應該大體上符合Google C++的代碼規範,這個規範不僅是一個規範,還告訴了你C++有哪些坑,你要避免不要那麼做跳開它們,強烈推薦C++程序員好好看看。聽說Google系的C++開源代碼寫的都很不錯,leveldb,protobuf什麼的還沒空看,找時間好好拜讀一下吧。


好的代碼 應該是實用的, 高效穩定的. 而最重要的 能被選出來說是最好的 那肯定是在符合上述要求下 讓閱讀者感到非常舒服而又能在第一時間找到自己想看的東西.

第一個: memcached.

代碼實現精巧幹練, 絲毫不會讓人感覺繁冗, 如果只是想看實現的機制 直接從介面代碼往裡面追下就能捋順, 整個閱讀經歷非常舒爽.

第二個: libevent 網路庫.

其實這個應該放在memcached前面去看, memcached底層是用這個實現網路功能, 但如果只是想看memcached的內部內存管理機制 也可以跳過這個. 閱讀感同memcached.

第三個: boost asio 網路庫.

這個庫相比前面兩個代碼量上比較多, 而且閱讀的話 首先要對boost有一定熟悉才比較好, 比如智能指針, 函數綁定, 模板, 等. 在這個前提下 如果想看boost的內部實現, 比如線程封裝, 同步操作的一些封裝, select EPOLL IOCP部分的實現以及一些小技巧, 都可以很方便的追進去看到核心代碼, 而且注釋特別清晰易讀.

一般開源庫要考慮的都會比我們去讀這部分代碼時候想得到的信息要多. 要考量性能, 通用性(要有足夠多的功能和靈活性滿足主要的需求和潛在的需求), 跨平台(一些會考慮跨平台 而且可能是多種平台 比如linux, bsd, mac, windows), 還有後期的可擴展性,等.

因此, 可能一個看上去要比較簡單的需求, 而實際實現上卻運用了大量的設計模式, 紛雜的細節技術, 而又往往注釋沒有或者不全 文檔缺失等. 最後造成的結果就是源碼讀起來很晦澀.


unreal


BOOST的部分代碼和SGI STL的源碼


boost部分代碼

chromium


Seastar: 用C++11實現的高性能非同步編程框架。這是一個非常有意思的項目。地址:https://github.com/scylladb/seastar


陳碩的muduo可以看看,知道現代cpp的用法。


redis吧,C語言,這個key-value資料庫代碼量也不算太大,但是裡面的數據結構實現的非常簡潔高效,內存管理優秀,承載並發能力優秀,易用性優秀,純C代碼,讀起來非常爽。

nginx,C語言,其實我沒看過,但是看起來很不錯的樣子耶,淘寶的tenigne就是基於nginx的,其源碼剖析資料較多,看起來很不錯。

tornado,python寫的,代碼簡潔高效,安全可靠,就是非同步需要好好理解下。

再補充下:有個阿里的做資料庫的前輩建議可以讀讀jeff dean的leveldb,這個是C++的,可以讀下看看,很優雅。


看過了SGI STL,才開始領略到C++和Java的不同。。


推薦閱讀:

C++17 基本完成,對於新特性大家怎麼看?
C/C++中相同的浮點數的內存布局一定是一樣嗎?
只使用 C++ 標準語法和標準庫如何做出優美的人機界面?
如何用 C++ 在 10 行內寫出八皇后?
C/C++該採用怎樣的命名規則才能讓自己的代碼足夠清晰呢?

TAG:C |