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

What is the difference between std::vector and llvm::SmallVector? which one to use when?

本文关键字:区别 什么时候 哪一个 什么 之间 vector llvm SmallVector std      更新时间:2023-10-16

我正在尝试了解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在文档中有描述

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

它包含一定数量的元素,这使它能够在实际元素数量低于该阈值时避免堆分配。这允许正常的";"小";在不失去对大输入的通用性的情况下快速。

请注意,这并不试图确保异常安全。


何时使用哪一个?

当:时使用std::vector

  • 您需要异常安全OR
  • 您不希望在标准库或
  • 容器不是瓶颈或
  • 性能根本不重要或者
  • 矢量无论如何都会很大,所以优化不会产生影响

时使用小型优化实现(如llvm::SmallVector或其他实现)

  • 以上均不适用

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

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