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

use*_*844 8 c++ stl vector llvm

我试图了解SmallVectorLLVM 中容器的使用.我认为std::vector可以用来代替小矢量.如果我们推出的元素llvm::SmallVector超过其大小,会发生什么?

lcs*_*lcs 13

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.
Run Code Online (Sandbox Code Playgroud)

当您知道持续拥有少量元素并且不会遇到堆分配时,SmallVector可以获得性能优势.这种性能优势是以异常安全为代价的,并且依赖于llvm库.


eer*_*ika 5

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

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

这是一个“向量”(实际上是一个可变大小的数组),针对数组较小的情况进行了优化。

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

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


什么时候用哪一个?

在以下情况下使用 std::vector:

  • 您需要异常安全或
  • 您不想要标准库之外的额外依赖项或
  • 容器不是瓶颈或
  • 性能甚至无关紧要或
  • 无论如何,向量都会很大,因此优化不会产生影响

在以下情况下使用小型优化的实现(例如 llvm::SmallVector 或其他实现)

  • 以上都不适用

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

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