跳转至

第三方基础库

这里只介绍一些对基础库的补充(类似于 Guava,Apache Commons 这样的库),不涉及到日志等其他第三方库,其他库在后面“常见库介绍”中会稍有涉及。

Google Abseil

这个库我个人强烈推荐,出于这样几个原因:

  1. Google 所有开源的产品都在将公共依赖组件转为依赖 Abseil,Google 内部有专门团队维护。
  2. 代码注释多,有专门的文档解释有哪些组件及其用法(https://abseil.io/docs/cpp/guides/),有博客解释为什么这么设计(https://abseil.io/blog/https://abseil.io/tips/)。
  3. 将 C++14/17/20/... 的部分组件 backport 到 C++11 中,接口和 C++ 标准的符合程度高。
  4. 目前提供的功能很朴实,看起来大概就能猜到是怎么实现的,但是功能很实用:
    1. Containers:对现有容器的补充,主要提升在性能方面,另外也有对 C++20 等标准新加入的一些功能的实现(try_emplacecontains,等等)。
    2. Hash:标准库的实现比较搓(我在上面讲相关内容的时候提过),又不太可能现在再去纠正其错误了,所以搞了一套哈希库,但是又很容易和标准库进行使用上的集成。
    3. Meta:有不少老编译器提供的标准库对于 type_traits 的实现都有问题,或者只提供了部分实现,这里也算是 backport 了一些东西。
    4. Numeric:int128,有的时候还是很有用的。
    5. Random:也属于标准库的实现有些问题(我在上面讲相关内容的时候提过),提供了更科学的实现和接口。
    6. String Formatting/Utilities:标准库的字符串简直就是灾难(我在上面讲相关内容的时候提过),基本上都靠这个了。
    7. Status:错误处理机制,基本上用来代替异常了。当然就算你用异常,也有地方需要不用异常,正确表达错误。
    8. Synchronization:更好用的同步原语,而且已经集成了 Thread-Safety Annotations。
    9. Time:更好用的接口(我在上面讲相关内容的时候提过),而且还能处理用户输入输出相关的问题。
  5. 居然还提供了配套的 clang-tidy 检查,太贴心了。

Boost

Boost 库是社区维护的搞得比较早的大杂烩库。总的来说我个人不建议使用 Boost 库,原因如下:

  1. Boost 代码质量参差不齐,有的组件质量较差。
  2. Boost 库为了兼容一些很老的 C++ 标准(比如说 C++98),做了很多 Hack 工作,这样有几个问题:
    1. 性能较差。
    2. 报错信息难理解。
    3. 实现复杂,容易有隐患。
  3. Boost 库历史上出现过很多次升级之后接口不兼容了的情况(Breaking Changes)。
  4. Boost 库实现的 backport 标准库的组件经常不符合标准。
  5. 很多第三方库都对 Boost 有依赖,容易产生菱形依赖。很多情况下我们都不是把源代码放到一起联合编译,而是依赖于预编译的二进制文件。Boost 不提供 ABI 兼容,这种菱形依赖的问题无法解决。

如果需要一些 Boost 库中比较独立的功能,可以参考 Boost 源码自己写一下。

Facebook Folly

这部分评论和公司内部情况相关,目前不便展开。

评论