2017-02-08 60 views

回答

5

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庫爲代價的。

3

std :: vector和LLVM :: SmallVector之間的區別是什麼?

我假設你熟悉標準向量。在文檔中描述了llvm :: SmallVector:

這是一個'vector'(真的是一個可變大小的數組),它針對數組較小時的情況進行了優化。

它包含一些原地的元素,當元素的實際數量低於該閾值時,允許它避免堆分配。這使得正常的「小」情況下可以快速而不失大量輸入的一般性。

請注意,這不會嘗試異常安全。


時使用哪一個?

使用std :: vector的時候:

  • 你需要異常安全或
  • 你不想超出標準庫或
  • 額外的依賴容器不是瓶頸OR
  • 性能甚至不重要或者
  • 矢量會變大,因此優化不會產生影響

使用小優化的實現(如LLVM :: SmallVector,或另一種實現方式)時

  • 無上述適用

而且如果發生什麼我們在llvm :: SmallVector中推入比它的大小更多的元素?

當內部小緩衝區耗盡時,會分配一個動態緩衝區,它的行爲將類似於std::vector

+0

@lax你會在[wikipedia]上找到一個概述(https://en.wikipedia.org/wiki/Exception_safety) – user2079303

相關問題