为什么 std::deque 不允许指定桶大小?
Why doesn't std::deque allow specifying the bucket size?
std::deque
将元素存储在固定大小的 "buckets"(数组)中。不同的编译器使用不同的桶大小:
- MSVC:16 字节或元素大小(如果更大)
- GCC:512 字节或元素大小(如果更大)
- 叮当声:
element_size < 256 ? 4096 : element_size * 16
对于 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
没有类似的措辞。
std::deque
将元素存储在固定大小的 "buckets"(数组)中。不同的编译器使用不同的桶大小:
- MSVC:16 字节或元素大小(如果更大)
- GCC:512 字节或元素大小(如果更大)
- 叮当声:
element_size < 256 ? 4096 : element_size * 16
对于 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
andunordered_multimap
, rehashing preserves the relative ordering of equivalent elements.
deque
没有类似的措辞。