[转]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


猜你喜欢

转载自blog.csdn.net/heiyeshuwu/article/details/80500659