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

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

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

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

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

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

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

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

The elements of an unordered associative container are organized into buckets. Keys with the same hash code appear in the same bucket. The number of buckets is automatically increased as elements are added to an unordered associative container, so that the average number of elements per bucket is kept below a bound. Rehashing invalidates iterators, changes ordering between elements, and changes which buckets elements appear in, but does not invalidate pointers or references to elements. For unordered_­multiset and unordered_­multimap, rehashing preserves the relative ordering of equivalent elements.

deque 没有类似的措辞。