std::deque
将元素存储在固定大小的“存储桶”(数组)中。不同的编译器使用不同的存储桶大小:
element_size < 256 ? 4096 : element_size * 16
对于MSVC(尤其是GVC)和GCC,如果双端队列元素的大小大于硬编码的大小,则std::deque
会变成复杂的std::list
,在大多数情况下会降低性能。
在我看来,Clang表现更好,无论双端队列元素的大小如何,存储桶将至少为16个元素。尽管对于小元素,最小的bucket大小4096字节在某些情况下可能不是最佳的。
为什么std::deque
没有用于存储桶大小的附加模板参数,其默认值是供应商认为合理的值?这不会破坏向后兼容性,但可以优化性能。
答案 0 :(得分:10)
deque
就像一个黑匣子。没有指定如何实现。该实现可以自由使用它喜欢的任何符合性能要求的技术。因此,不能将存储桶大小作为模板参数。
当然,这样的数据结构很有用。该标准可以选择提供(以名称deque
或作为新容器提供),但事实并非如此。相反,保证unordered_*
容器使用存储桶。根据{{3}}:
无序关联容器的元素被组织为 存储桶。具有相同哈希码的键将出现在同一存储桶中。桶的数量随着元素的添加而自动增加 一个无序的关联容器,因此 每个存储桶中的元素保持在界限以下。重新哈希无效 迭代器,元素之间的更改顺序以及 buckets元素出现在其中,但不会使指针或 对元素的引用。对于
unordered_multiset
和unordered_multimap
,重新哈希处理保留了 等效元素。
deque
的措辞相似。