Abseil 源码阅读笔记·总览 [0x01]

简介

按照官网的介绍,Abseil 实际上是一组开源代码的集合,使用的是 C++14 标准,是 C++ 标准库的补充,这个库在 Google 的开源项目中应用广泛,经过了生产环境的检验。

Abseil 主要有以下优点:

  1. 兼容较新的 C++ 标准。这个库虽然是用的 C++14,但是实现了一些高版本的特性,并且确保了有相同的 API,比如 string_view,直接使用 absl::string_view,在高版本会使用 std::string_view,而在低版本会用 Abseil 库。这可以为旧代码引入新的特性。
  2. 兼容 Google 的开源项目。
  3. 保证了一直使用最新版本也不会出现兼容问题(只要遵循兼容性指南)。
  4. 经过生产环境的测试。
  5. 更加适用特定领域。C++ 标准库为了泛用,设计上会有一些考虑得“过于周到”的地方,而对于大多情况来说这些我们并不需要。

兼容指南

  1. 不要依赖内部细节。这点很好理解,封装就是为了隐藏内部细节,应当依赖公共 API.
  2. 使用什么就 include 什么。意思是不要指望 Abseil 内部的间接 include 来帮你引入想用的东西,因为里面会变。
  3. 不要依赖动态卸载。Abseil 库的设计不适用于动态加载和卸载。
  4. 不要打开命名空间 absl。就是说,不要自己往 absl 命名空间里面定义东西。
  5. 不要依赖于 Abseil API 的签名。不能通过地址或者元编程获取签名的方式来调用 Abseil API,还是一样的原因,会变。
  6. 不要前向声明 Abseil API。原因和上一点类似,函数签名也可能会变,比如往函数加个有默认值的参数。直接调函数,因为有默认值,不会有问题;但是如果前向声明里没添上参数,函数签名就会不匹配。
  7. 不要依赖 ADL(参数依赖查找)。
  8. 不要在全局命名空间中不加限定地调用函数。这说的还是重复的问题。

总览

Abseil 库很贴心地给出了 Codemap,包含了这些东西:

  • base:包含了一些初始化的代码和一些其他模块依赖的代码
  • algorithm:对 STL algorithm 的补充
  • container:STL 风格的容器
  • debugging:一些用来调试的代码,用于检查内存泄露、跟踪堆栈等
  • hash:哈希相关的东西
  • memory:增强版的 memory 库
  • meta:一些额外的类型检查功能(感觉有了 concept 之后似乎意义不大?)
  • numeric:128 位整型和 C++20 中的一些位运算函数
  • strings:包含一些字符串的处理函数,和 string_view 的兼容实现
  • synchronization:并行相关
  • time:时间库
  • types:非容器的一些类型,比如 optional 的兼容实现
  • utility:一些帮助代码

Abseil 库遵循 Google 的代码风格,所以在代码里会尽可能不使用异常。


Abseil 源码阅读笔记·总览 [0x01]
http://xiao-h.com/2025/01/22/Abseil-0x01-总览/
作者
小H
发布于
2025年1月22日
许可协议