Abseil 源码阅读笔记·总览 [0x01]
简介
按照官网的介绍,Abseil 实际上是一组开源代码的集合,使用的是 C++14 标准,是 C++ 标准库的补充,这个库在 Google 的开源项目中应用广泛,经过了生产环境的检验。
Abseil 主要有以下优点:
- 兼容较新的 C++ 标准。这个库虽然是用的 C++14,但是实现了一些高版本的特性,并且确保了有相同的 API,比如
string_view
,直接使用absl::string_view
,在高版本会使用std::string_view
,而在低版本会用 Abseil 库。这可以为旧代码引入新的特性。 - 兼容 Google 的开源项目。
- 保证了一直使用最新版本也不会出现兼容问题(只要遵循兼容性指南)。
- 经过生产环境的测试。
- 更加适用特定领域。C++ 标准库为了泛用,设计上会有一些考虑得“过于周到”的地方,而对于大多情况来说这些我们并不需要。
兼容指南
- 不要依赖内部细节。这点很好理解,封装就是为了隐藏内部细节,应当依赖公共 API.
- 使用什么就 include 什么。意思是不要指望 Abseil 内部的间接 include 来帮你引入想用的东西,因为里面会变。
- 不要依赖动态卸载。Abseil 库的设计不适用于动态加载和卸载。
- 不要打开命名空间 absl。就是说,不要自己往 absl 命名空间里面定义东西。
- 不要依赖于 Abseil API 的签名。不能通过地址或者元编程获取签名的方式来调用 Abseil API,还是一样的原因,会变。
- 不要前向声明 Abseil API。原因和上一点类似,函数签名也可能会变,比如往函数加个有默认值的参数。直接调函数,因为有默认值,不会有问题;但是如果前向声明里没添上参数,函数签名就会不匹配。
- 不要依赖 ADL(参数依赖查找)。
- 不要在全局命名空间中不加限定地调用函数。这说的还是重复的问题。
总览
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-总览/