簡體   English   中英

為什么std :: deque不允許指定桶大小?

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

std::deque將元素存儲在固定大小的“桶”(數組)中。 不同的編譯器使用不同的桶大小:

  • MSVC:16字節或元素大小,如果它更大
  • GCC:512字節或元素大小,如果它更大
  • Clang: element_size < 256 ? 4096 : element_size * 16 element_size < 256 ? 4096 : element_size * 16

對於MSVC(尤其是)和GCC,如果deque元素大小大於硬編碼大小,則std::deque會變成一個復雜的std::list ,在大多數情況下會有性能損失。

在我看來,Clang做得更好,無論deque元素的大小如何,桶都至少有16個元素。 盡管4096字節的最小桶大小在某些情況下對於小元素可能是次優的。

為什么std::deque沒有額外的模板參數用於存儲桶大小,默認值是供應商認為合理的? 這不會破壞向后兼容性,但會允許性能優化。

deque就像一個黑盒子。 沒有具體說明它是如何實現的。 該實現可以自由使用它喜歡的任何技術以符合性能要求。 因此,它不能將桶大小作為模板參數。

當然,這種數據結構很有用。 標准可以選擇提供它(在名稱deque或作為新容器),但他們沒有。 相反, unordered_*容器保證使用桶。 [unord.req] / 9

無序關聯容器的元素被組織成 具有相同哈希碼的密鑰出現在同一個存儲桶中。 當元素添加到無序關聯容器時,桶的數量會自動增加,因此每個桶的平均元素數量保持在一個邊界之下。 重新散列使迭代器無效,元素之間的順序更改以及桶元素出現的更改,但不會使指針或對元素的引用無效。 對於unordered_multisetunordered_multimap ,rehashing保留了等效元素的相對順序。

deque沒有類似的措辭。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM