我想了解在LLVM中使用SmallVector容器。我認爲std :: vector可以用在小矢量的地方。如果我們在llvm :: SmallVector中推入更多元素而不是它的大小會發生什麼?std :: vector和LLVM :: SmallVector之間的區別是什麼?哪一個使用時?
回答
llvm::SmallVector
是針對小陣列優化的矢量。這種優化來自於對有限數量的元素不執行堆分配。
如果添加的元素多於描述的要使用自動存儲分配的元素,它將回退到std::vector
的行爲並分配更大和更大的陣列。
llvm::SmallVector<int, 10> smallVector;
for(int i = 0; i < 10; i++)
{
smallVector.push_back(i);
}
// No heap allocations have been performed up to this point.
smallVector.push_back(11);
// Only 10 spaces for non heap allocated elements,
// so the push_back above causes a heap allocation.
SmallVector可以有性能優勢,當你知道你會一直有一個小數量的元素,也不會碰到堆分配。這種性能優勢是以異常安全和依賴於llvm庫爲代價的。
std :: vector和LLVM :: SmallVector之間的區別是什麼?
我假設你熟悉標準向量。在文檔中描述了llvm :: SmallVector:
這是一個'vector'(真的是一個可變大小的數組),它針對數組較小時的情況進行了優化。
它包含一些原地的元素,當元素的實際數量低於該閾值時,允許它避免堆分配。這使得正常的「小」情況下可以快速而不失大量輸入的一般性。
請注意,這不會嘗試異常安全。
時使用哪一個?
使用std :: vector的時候:
- 你需要異常安全或
- 你不想超出標準庫或
- 額外的依賴容器不是瓶頸OR
- 性能甚至不重要或者
- 矢量會變大,因此優化不會產生影響
使用小優化的實現(如LLVM :: SmallVector,或另一種實現方式)時
- 無上述適用
而且如果發生什麼我們在llvm :: SmallVector中推入比它的大小更多的元素?
當內部小緩衝區耗盡時,會分配一個動態緩衝區,它的行爲將類似於std::vector
。
@lax你會在[wikipedia]上找到一個概述(https://en.wikipedia.org/wiki/Exception_safety) – user2079303
- 1. 「vector :: operator =」和「vector :: assign」之間的區別是什麼?
- 2. vector :: begin()和std :: begin()之間的區別
- 3. std :: set和std :: vector有什麼區別?
- 4. i-vector和d-vector之間的區別
- 5. cbegin和vector之間的區別是什麼?
- 6. LinkedList和ArrayList之間有什麼區別,以及何時使用哪一個?
- 7. $(())和expr之間的區別是什麼?
- 8. $和$ .fn之間的區別是什麼?
- 9. ++和:haskell之間的區別是什麼?
- 10. $(「」)和$ .find(「」)之間的區別是什麼?
- 11. 「\」和「\。」之間的區別是什麼?
- 12. 「$ | ++」和「$ | = 1」之間的區別是什麼
- 13. $(...)和`...`之間的區別是什麼
- 14. .equals()和==之間的區別是什麼?
- 15. [undefined]和[,]之間的區別是什麼?
- 16. C++ std :: lock和std :: unique_lock之間有什麼區別?
- 17. std :: strtol和std :: stoi之間有什麼區別?
- 18. std :: condition_variable和std :: condition_variable_any之間有什麼區別?
- 19. -std = C++ 11和-std = gnu ++ 11之間有什麼區別?
- 20. DisplayDataMember和ItemTemplate之間的區別是什麼以及何時使用另一個?
- 21. std :: logical_not和std :: not1之間的區別?
- 22. std :: is_integer和std :: is_integral之間的區別?
- 23. std :: regex_match和std :: regex_search之間的區別?
- 24. std :: uninitialized_copy和std :: copy之間的區別?
- 25. std :: mutex和std :: shared_mutex之間的區別
- 26. 爲什麼llvm :: SmallVector拆分其存儲?
- 27. vector :: push_back和string :: push_back之間的區別?
- 28. 什麼是UIGestureRecognizer的使用和UITouch和UIGestureRecoginzer之間的區別
- 29. C++ get和typecasting之間的用法區別是什麼?我應該使用哪一個?
- 30. atomic.store和atomic_thread_fence之間有什麼區別?
'std :: vector <>'是... ** st ** andar ** d **。 –
相關討論:https://www.youtube.com/watch?v=vElZc6zSIXM –