第三方基础库
这里只介绍一些对基础库的补充(类似于 Guava,Apache Commons 这样的库),不涉及到日志等其他第三方库,其他库在后面“常见库介绍”中会稍有涉及。
Google Abseil
这个库我个人强烈推荐,出于这样几个原因:
- Google 所有开源的产品都在将公共依赖组件转为依赖 Abseil,Google 内部有专门团队维护。
- 代码注释多,有专门的文档解释有哪些组件及其用法(https://abseil.io/docs/cpp/guides/),有博客解释为什么这么设计(https://abseil.io/blog/,https://abseil.io/tips/)。
- 将 C++14/17/20/... 的部分组件 backport 到 C++11 中,接口和 C++ 标准的符合程度高。
- 目前提供的功能很朴实,看起来大概就能猜到是怎么实现的,但是功能很实用:
- Containers:对现有容器的补充,主要提升在性能方面,另外也有对 C++20 等标准新加入的一些功能的实现(
try_emplace
,contains
,等等)。 - Hash:标准库的实现比较搓(我在上面讲相关内容的时候提过),又不太可能现在再去纠正其错误了,所以搞了一套哈希库,但是又很容易和标准库进行使用上的集成。
- Meta:有不少老编译器提供的标准库对于
type_traits
的实现都有问题,或者只提供了部分实现,这里也算是 backport 了一些东西。 - Numeric:
int128
,有的时候还是很有用的。 - Random:也属于标准库的实现有些问题(我在上面讲相关内容的时候提过),提供了更科学的实现和接口。
- String Formatting/Utilities:标准库的字符串简直就是灾难(我在上面讲相关内容的时候提过),基本上都靠这个了。
- Status:错误处理机制,基本上用来代替异常了。当然就算你用异常,也有地方需要不用异常,正确表达错误。
- Synchronization:更好用的同步原语,而且已经集成了 Thread-Safety Annotations。
- Time:更好用的接口(我在上面讲相关内容的时候提过),而且还能处理用户输入输出相关的问题。
- Containers:对现有容器的补充,主要提升在性能方面,另外也有对 C++20 等标准新加入的一些功能的实现(
- 居然还提供了配套的 clang-tidy 检查,太贴心了。
Boost
Boost 库是社区维护的搞得比较早的大杂烩库。总的来说我个人不建议使用 Boost 库,原因如下:
- Boost 代码质量参差不齐,有的组件质量较差。
- Boost 库为了兼容一些很老的 C++ 标准(比如说 C++98),做了很多 Hack 工作,这样有几个问题:
- 性能较差。
- 报错信息难理解。
- 实现复杂,容易有隐患。
- Boost 库历史上出现过很多次升级之后接口不兼容了的情况(Breaking Changes)。
- Boost 库实现的 backport 标准库的组件经常不符合标准。
- 很多第三方库都对 Boost 有依赖,容易产生菱形依赖。很多情况下我们都不是把源代码放到一起联合编译,而是依赖于预编译的二进制文件。Boost 不提供 ABI 兼容,这种菱形依赖的问题无法解决。
如果需要一些 Boost 库中比较独立的功能,可以参考 Boost 源码自己写一下。
Facebook Folly
这部分评论和公司内部情况相关,目前不便展开。