为什么 std::d eque 不允许指定存储桶大小?

Why doesn't std::deque allow specifying the bucket size?

本文关键字:存储 std eque 不允许 为什么      更新时间:2023-10-16
std::deque

将元素存储在固定大小的"桶"(数组)中。不同的编译器使用不同的存储桶大小:

  • MSVC:16 字节或元素大小(如果更大)
  • GCC:512 字节或元素大小(如果更大)
  • 叮当当:element_size < 256 ? 4096 : element_size * 16

对于 MSVC(尤其是)和 GCC,如果 deque 元素大小大于硬编码大小,std::deque在大多数情况下会变成一个复杂的std::list,性能会降低。

在我看来,Clang 做得更好,无论 deque 元素的大小如何,桶至少会有 16 个元素。尽管在某些情况下,对于小型元素,4096 字节的最小存储桶大小可能不是最佳的。

为什么std::deque没有一个额外的模板参数来表示存储桶大小,其默认值为供应商认为合理的默认值?这不会破坏向后兼容性,但可以优化性能。

deque就像一个黑匣子。 没有指定它是如何实现的。 该实现可以自由使用任何它喜欢的技术来符合性能要求。 因此,它不能将存储桶大小作为模板参数。

当然,这样的数据结构是有用的。 标准可以选择提供它(以deque名称或作为新容器),但他们没有。 相比之下,unordered_*容器保证使用存储桶。 Per [unord.req]/9:

无序关联容器的元素被组织成。具有相同哈希代码的密钥将显示在同一存储桶中。当元素添加到 一个无序的关联容器,使得平均数量 每个存储桶的元素保持在边界以下。重新散列使无效 迭代器,更改元素之间的顺序,以及更改 存储桶元素出现在 中,但不会使指针或 对元素的引用。对于unordered_­multisetunordered_­multimap,重新散列保留了 等效元素。

deque没有类似的措辞。