1. 程式人生 > 其它 >你讀過的最好的 C++ 開原始碼是什麼?

你讀過的最好的 C++ 開原始碼是什麼?

作者:程式設計指北
連結:https://www.zhihu.com/question/21376384/answer/1925233838
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

必須是 Facebook Folly!這是facebook 開源的基於C++14的庫,在facebook內部廣泛使用。

可以說是我看過最優雅的現代C++專案,裡面一部分工具實現非常棒,比如hash map

Folly的全稱為Facebook Open-source Library,目的不是為了替代標準庫,而是對標準庫的一種補充,尤其是大規模下的效能。

而且有很多C++標準庫沒有的工具,比如我之前寫程式碼需要一個執行緒安全的hash map,但是C++標準庫中沒有執行緒安全的hash map。

而 folly 中就有一個高效能的hash map,還有 string,對比 標準庫有極大的效能提升。

用Facebook自己的話來說就是:

Good performance at large scale is a unifying theme in all of Folly.

倉庫地址:facebook/folly

這真的是一個很好的現代C++專案!

另外再推薦一個對於C++學習比較好的專案(不是現代C++哈): Google LevelDB ,這個專案不像 Chromium 那麼巨大,屬於一個人花點時間就能看懂的專案:

Github地址:google/leveldb

而且現在很多分散式儲存都將 LevelDB 作為本地儲存引擎,也是作為學習 LSM 這種經典的儲存結構的優秀程式碼實現。

它的特性Github主頁已經說了:

在這,順便分享一份大學期間自己整理的電子書庫,絕不是在網上那種打包下載的,而是自己需要學到某個方向知識的時候,去網上挨個找的,最後彙總而成。

彙集了程式語言(Java、C++、C、Python等等)、作業系統、計算機網路、系統架構、設計模式、程式設計師數學、測試、中介軟體 、前端開發、後臺開發、網路程式設計、Linux使用及核心、資料庫、Redis....等主流的程式設計學習書籍。

我整理的這些書大家可以在這裡獲取,對於學習計算機的同學幫助非常大,且十分系統

書單:書單推薦,少即是多(含下載方式)

網上看到一個寫的不錯的文章,可以看下 LevelDB 的架構:

作者:linjinhe 連結: 來源:簡書

上圖簡單展示了 LevelDB 的整體架構。LevelDB 的靜態結構主要由六個部分組成:

  1. MemTable:記憶體資料結構,具體實現是 SkipList。 接受使用者的讀寫請求,新的資料修改會首先在這裡寫入。
  2. Immutable MemTable:當 MemTable 的大小達到設定的閾值時,會變成 Immutable MemTable,只接受讀操作,不再接受寫操作,後續由後臺執行緒 Flush 到磁碟上。
  3. SST Files:Sorted String Table Files,磁碟資料儲存檔案。分為 Level0 到 LevelN 多層,每一層包含多個 SST 檔案,檔案內資料有序。Level0 直接由 Immutable Memtable Flush 得到,其它每一層的資料由上一層進行 Compaction 得到。
  4. Manifest Files:Manifest 檔案中記錄 SST 檔案在不同 Level 的分佈,單個 SST 檔案的最大、最小 key,以及其他一些 LevelDB 需要的元資訊。由於 LevelDB 支援 snapshot,需要維護多版本,因此可能同時存在多個 Manifest 檔案。
  5. Current File:由於 Manifest 檔案可能存在多個,Current 記錄的是當前的 Manifest 檔名。
  6. Log Files (WAL):用於防止 MemTable 丟資料的日誌檔案。

粗箭頭表示寫入資料的流動方向:

  1. 先寫入 MemTable。
  2. MemTable 的大小達到設定閾值的時候,轉換成 Immutable MemTable。
  3. Immutable Table 由後臺執行緒非同步 Flush 到磁碟上,成為 Level0 上的一個 sst 檔案。
  4. 在某些條件下,會觸發後臺執行緒對 Level0 ~ LevelN 的檔案進行 Compaction。

讀操作的流動方向和寫操作類似:

  1. 讀 MemTable,如果存在,返回。
  2. 讀 Immutable MemTable,如果存在,返回。
  3. 按順序讀 Level0 ~ Leveln,如果存在,返回。
  4. 返回不存在。

整體的程式碼量也不是特別巨大,大家完全可以去啃下來,對於提升 C++ 編碼能力幫助極大!

漫思