概述: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] https://abseil.io/tips/ : 這裏會每週介紹一些谷歌內容的 C++ tips
來源:https://zhuanlan.zhihu.com/p/29940200