>_ DevTrendszh

语言

首页

语言

板块

前端 后端 移动端 DevOps AI / ML 游戏开发 区块链 嵌入式 安全
C-plus-plus

Google如何根据自身需求定制标准C++库

想象一下,为每天处理数十亿请求的系统编写代码。C++标准库(STL)很好,但有时候它的通用性反而成了瓶颈。某些地方哈希表性能不足,某些地方缺少方便的日期处理,而某些C++20或C++23新特性你想立即使用,却不想等待所有服务器上的编译器更新。

这正是Abseil诞生的原因。它不是STL的替代品,而是一种扩展,Google在其内部项目(如Search、Ads和Maps)中使用。开发者只是将经过多年验证的代码整理后开源发布。

这把瑞士军刀里面有什么

如果你查看abseil-cpp仓库,可以找到数十个库。但我会重点介绍那些真正改变日常开发体验的。

Swiss Tables:当std::unordered_map太慢时

Abseil中有容器族系 absl::flat_hash_mapabsl::flat_hash_set。Google称它们为"Swiss tables"。与使用链表解决冲突的标准 std::unordered_map 不同,Abseil使用开放寻址和SIMD指令进行查找。在实践中,这提供了显著的速度提升和内存节省,这得益于更好的缓存局部性。

智能字符串处理

对于厌倦了为基础任务编写样板代码的人来说, strings 库是一个救星。例如, absl::StrCatabsl::StrAppend 比通常的 +std::stringstream 操作符更快,因为它们预计算所需缓冲区大小并避免不必要的分配。而 absl::StrSplit 让你只需一行代码就能用灵活的过滤器拆分字符串。

无异常的错误处理

许多大型项目由于开销或安全考虑而禁用C++中的异常。为此,Abseil提供了 absl::Statusabsl::StatusOr<T> 。这是一种优雅的方式,可以从函数返回结果或带有文本描述的错误代码。如果你曾经使用过Go或Rust,这种方法对你来说会非常熟悉和合理。

同步与时间

他们提供了 absl::Mutex 来替代标准的 std::mutex 。它设计为在高线程竞争下更高效。而 time 库使时区和时间间隔的处理比冗余的 std::chrono 简单得多。

技术理念:Live at Head

Abseil有一个特点,要么让人望而却步,要么吸引人。Google推广"Live at Head"概念。这意味着他们建议始终从最新的master版本构建项目。

开发者努力不破坏API,但如果为了改进库而必须这样做,他们也会去做。为了让用户更轻松,Abseil附带了一些工具,用于自动重构代码以适应新的API版本。对于那些不想冒险的人,有LTS版本可用,但主要重点是向前推进。

该项目支持使用Bazel和CMake构建。如果你已经在使用Bazel,集成Abseil只需几分钟。

谁适合使用

我建议在两种情况下仔细看看Abseil。

首先,如果你正在编写高负载后端。将标准map替换为 absl::flat_hash_map 有时会免费获得性能提升,而无需重写逻辑。

其次,如果你被困在旧的C++标准上(例如C++17),但真的很想使用C++20的功能。Abseil经常回移植新的语言能力,使它们在旧编译器上可用。

Abseil不仅仅是一个工具集合,它反映了全球技术最先进的公司之一如何编写代码。这个库很大,有时很复杂,但质量极高。如果你需要标准库无法提供的功能,或者你在为每一分性能而战,这绝对是一个值得拥有的工具。

最好的入门方式是阅读官方指南,因为仓库中的README相当简短,更多是作为项目文件夹的地图。

相关项目