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