C++26 的 std::hive 有多快?
摘要
本文针对新的 C++26 std::hive 容器与 std::vector 和 std::list 进行了基准测试,结果表明其插入成本约为 vector 的两倍,迭代时与 list 一样受延迟限制,但在局部性和分散删除时的 erase 性能上更优。
<p><a href="https://lobste.rs/s/jqydry/how_fast_is_c_26_s_std_hive">评论</a></p>
查看缓存全文
缓存时间: 2026/08/03 01:33
# C++26 的 std::hive 有多快?
Source: https://lemire.me/blog/2026/08/02/how-fast-is-c26s-stdhive/
C++26 在标准库中新增了一个容器:`std::hive`。它意在填补 `std::vector` 和 `std::list` 之间的空白。与 vector 类似,它将元素保存在连续的内存块中,因此遍历时你不需要为每个元素追索指针。与 list 类似,一旦元素被插入,它就永远不会移动:你的指针、引用和迭代器始终保持有效,并且你可以在常数时间内删除任意元素,而不影响其他元素。
在内部,hive 是一个由块组成的链表。每个块携带一个 *skipfield*(跳过字段):每个槽位有一个小整数,它告诉迭代器需要跳过多已删除的槽位。
据我所知,目前还没有标准库提供 `std::hive`。幸运的是,有一个实现(plf::hive (https://github.com/mattreecebentley/plf_hive),作者 Matt Bentley)以单个头文件的形式提供,你今天就可以使用。
我使用的元素类型是 `uint64_t`,编译器为 GCC 16.1,并启用了 `-O3 -march=native`,运行在 Intel Xeon Gold 6548N(Emerald Rapids)上,并固定在一个核心上。数字是每元素的纳秒数,以及每元素退役的周期数和指令数。
我们从空容器开始,追加一百万个值,然后销毁容器。
| container | ns/element | instructions/element |
|---|---|---|
| `std::vector` (`reserve`) | 0.29 | 8.0 |
| `std::vector` | 0.81 | 8.0 |
| `std::hive` | 1.57 | 16.2 |
| `std::hive` (`reserve`) | 1.76 | 17.0 |
| `std::list` | 14.22 | 220.0 |
`std::list` 每个元素需要一次分配,而 glibc 的 malloc 和 free 加起来,每个元素要花费超过 200 条指令。它落后于其他所有容器一个数量级。这并不新鲜。
有趣的对比是 vector 与 hive。hive 的成本大约是 vector 的两倍,所需指令数也是两倍。这是 skipfield 的代价:每次插入都要写入一个元素 *和* 一个 skipfield 条目,并维护块的记账信息。注意,在我的实验中,对 hive 调用 `reserve` 并无帮助。
接下来,我们遍历容器并对值求和。
| container | ns/element | cycles/element | instructions/element |
|---|---|---|---|
| `std::vector` | 0.22 | 0.78 | 1.0 |
| `std::list` | 1.51 | 5.27 | 4.0 |
| `std::hive` | 1.77 | 6.18 | 9.0 |
在这里,hive 的迭代速度并不比链表快,实际上还要稍慢一些,并且比 vector 慢约八倍。
vector 的循环每元素只退休一条指令,并在 0.78 个周期内完成:处理器同时执行多个元素。这之所以可能,是因为 `std::vector` 的实现受益于
相似文章
C++26 发布了一个无人要求的 SIMD 库
文章批评了 C++26 中的新 std::simd 库,认为它比标量循环慢,编译速度慢,并且被自动向量化器和 Google Highway 等替代库超越,质疑其在经过十年标准化过程后的价值。
使用跳房子哈希的快速哈希映射和哈希集合的C++实现
hopscotch-map库是一个使用跳房子哈希的快速哈希映射和哈希集合的C++实现,在大多数情况下性能优于std::unordered_map。
C++ 标准库在过去十五年间一直在自我撤步,证据公开
一份详细的目录,列出了从 C++11 到 C++26 期间被正式弃用、非正式不推荐或由于 ABI 约束实际上已损坏但无法修复的 C++ 标准库特性。文章指出,C++ 委员会推出一系列替代品来替换其自身特性的模式始终如一,其中包含一个基准测试,显示 Rust 和 C++ 标准库容器之间的 P99 延迟差异高达 58 倍。
C++26:标准库强化
C++26 引入了标准化的库强化机制,用于在运行时捕获常见的未定义行为(如越界访问)。基于 Google 的生产经验,此举仅带来 0.30% 的性能开销,同时将段错误减少了 30%。
@vivekgalatage: 迟到总比不到好。我知道C++26已经全面推出,但许多功能的基础版本源自……
所有C++20核心语言功能的详细概述及示例,作为速查表。