std :: vector和llvm :: SmallVector有什么区别?哪一个使用的时候?

时间:2017-02-08 19:32:48

标签: c++ vector stl llvm

我试图了解LLVM中SmallVector容器的使用。我认为std::vector可以用来代替小矢量。如果我们在llvm::SmallVector中推送的元素多于其大小,会发生什么呢?

2 个答案:

答案 0 :(得分:10)

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库为代价的。

答案 1 :(得分:3)

  

std :: vector和LLVM :: SmallVector有什么区别?

我假设您熟悉标准向量。 llvm :: SmallVector在文档中描述:

  

这是一个'矢量'(实际上是一个可变大小的数组),针对阵列很小的情况进行了优化。

     

它包含一些就地的元素,这允许它在实际元素数低于该阈值时避免堆分配。这允许正常的“小”情况快速而不会失去大输入的一般性。

     

请注意,这不会尝试异常安全。

  

哪一个使用?

在:

时使用std :: vector
  • 您需要例外安全或
  • 除了标准库或
  • 之外,您不需要额外的依赖关系
  • 容器不是瓶颈或
  • 表现甚至不重要或
  • 无论如何,向量将会很大,因此优化不会产生影响

时使用小优化的实现(例如llvm :: SmallVector或其他实现)
  • 以上都不适用
  

如果我们在llvm :: SmallVector中推送的元素大于其大小,会发生什么?

当内部小缓冲区耗尽时,会分配一个动态缓冲区,其行为类似于std::vector