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

时间:2019-07-14 23:34:02

标签: c++ stddeque

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

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

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

在我看来,Clang表现更好,无论双端队列元素的大小如何,存储桶将至少为16个元素。尽管对于小元素,最小的bucket大小4096字节在某些情况下可能不是最佳的。

为什么std::deque没有用于存储桶大小的附加模板参数,其默认值是供应商认为合理的值?这不会破坏向后兼容性,但可以优化性能。

1 个答案:

答案 0 :(得分:10)

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

当然,这样的数据结构很有用。该标准可以选择提供(以名称deque或作为新容器提供),但事实并非如此。相反,保证unordered_*容器使用存储桶。根据{{​​3}}:

  

无序关联容器的元素被组织为   存储桶。具有相同哈希码的键将出现在同一存储桶中。桶的数量随着元素的添加而自动增加   一个无序的关联容器,因此   每个存储桶中的元素保持在界限以下。重新哈希无效   迭代器,元素之间的更改顺序以及   buckets元素出现在其中,但不会使指针或   对元素的引用。对于unordered_­multiset和   unordered_­multimap,重新哈希处理保留了   等效元素。

deque的措辞相似。