[轉]Google開源的C++庫 Abseil 庫


概述:Abseil已在Google歷經十多年的開發,它的目的是爲Google編程人員在各種項目上的工作需求提供支持,這些項目包括Protocol Buffers、gRPC和TensorFlow等。
Google公開了其項目內部使用的一系列C++庫,隨後還會公開其Python庫。

Abseil已在Google歷經十多年的開發,它的目的是爲Google編程人員在各種項目上的工作需求提供支持,這些項目包括Protocol Buffers、gRPC和TensorFlow等。Google評價Abseil爲:
  • 它是從Google內部代碼塊中抽取出來的一系列最基礎的軟件庫。作爲基本的組成部分,這些軟件庫支撐了幾乎全部Google在運行的項目。以前這些API是零零散散地嵌入在Google的大部分開源項目中,現在我們將它們規整在一起,形成這樣一個全面的項目。
  • Abseil是Google代碼庫的最基本構建模塊,其代碼經過了生產環節測試,此後還會繼續得到完全的維護。

最初,Abseil提供的抽象並非C++ 14或C++ 17的組成部分,但最終它們已被添加到C++標準中。例如,Google提供一個稱爲StringPiece的類型,隨後C++ 17也添加了一個稱爲std::string_view的相近類型。爲了與新的C++ 17類型具有一致的API,Google將StringPiece重構爲absl::string_view。從底層機制上看,如果開發人員正在使用的是C++ 17,那麼Abseil的string_view默認爲標準實現;如果開發人員正在使用的是C++ 17以前的版本,那麼string_view默認爲Google的實現。
 
使用Abseil的優點在於可以訪問一些目前依然尚未添加到標準中的C++特性,並且一旦這些特性被添加到C++標準中,Google保證會重構這些特性爲默認使用標準實現。Google鼓勵開發人員使用Abseil,並提及已有超過兩億五千萬行的C++代碼使用它,並且幾乎所有從頭開始構建的項目都使用了它。這意味着,Abseil已被Google廣爲使用,並出於與項目需求同步的考慮而得以頻繁維護。
 
Abseil中包括如下的庫:
  • base:初始化,以及其它的基礎代碼。 
  • algorithm:對C++的<algorithm>庫的補充,併爲原算法提供了基於容器的版本。 
  • container:提供了更多的STL類型容器。 
  • debugging:用於檢查泄漏的調試庫。 
  • memory:包括兼容C++ 11版本的std::make_unique()和內存管理。 
  • meta:包括兼容C++ 11版本的類型檢查,在C++ 14和C++ 17版本的C++ <type_traits>庫中可用。 
  • numeric:兼容C++ 11的128位整數。 
  • strings:各種字符串工具。 
  • synchronization:併發原語和同步抽象。 
  • time:抽象了絕對時間點操作和時區操作。 
  • types:非容器工具的類型。 

Abseil的代碼採用Apache許可,已發佈在GitHub上。其Python版本的軟件庫將隨後發佈。


來源:https://www.evget.com/article/2017/10/9/26962.html



最近 Google 開源了其內部多年使用的 C++ 代碼庫 Abseil 作爲 C++ 標準庫的補充,並會對其進行持續更新,本文對其進行簡要介紹。

一句話概括,這個庫的特點是用 C++ 11 的代碼實現了許多 C++ 14 和 C++ 17 的特性,所以你的編譯器也要支持 C++ 11(gcc 4.8+/clang 3.3+,不同平臺略有差異)。

需要注意一點的是 Google 內部代碼是不支持異常(Excepton)的,C++ 異常的優劣之處有許多討論(知乎上的討論),不用異常可以在一定程度上利於編譯器優化,這裏主要可能還是歷史支持原因。如果你的項目是支持異常的建議要好好測試一下,具體參考下 abseil / Abseil Fundamentals


Abseil 簡要組成部分如下:

  • base Abseil Fundamentals :包含初始化代碼和其它部分依賴的代碼。除了 C++ 標準庫外不依賴外部代碼
  • algorithm :C++ <algorithm> 庫的增強
  • container :STL 風格容器
  • debugging :內存泄露檢查
  • memory :智能指針和內存管理
  • meta :用 C++11 兼容代碼支持 C++14 和 C++17 版本的 <type_traits> 庫
  • numeric :支持 C++11 兼容的 128 位整數
  • strings :string 相關函數增強
  • synchronization :同步原語和抽象支持
  • time :時間方面的計算
  • types :非容器類型的工具類型


一些使用要點:

  • 不要使用編譯版本的庫,不保證 ABI 二進制級別的兼容
  • 不會頻繁更新 API 接口,如果更新會提供工具,請使用工具或指導進行更新(畢竟谷歌內部的代碼庫有超過250M行,不可能全部手動更新)
  • 共享庫的 dynamic unloading 可能不被支持,同時不是所有代碼都支持動態載入
  • 儘量使用命名空間前綴 absl
  • 支持基本的異常,但自定義的異常可能不被完整支持
  • 至少五年的支持(哈哈,想起了 google reader)
  • 需要使用 Bazel (類似於CMake,最早是用來支持 TensorFlow 開發的工具)進行編譯,這個可能會影響現有代碼的構建方式

另外 Google 還開源了一份 python 代碼庫 abseil-py


更多內容參見如下鏈接:

[1] 選擇 abseil 的原因

[2] 兼容性指導

[3] abseil / Design Notes :設計理念,現在還只有兩篇文章,後續應該會更新

[4] abseil.io/tips/ : 這裏會每週介紹一些谷歌內容的 C++ tips


來源:https://zhuanlan.zhihu.com/p/29940200


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章