std::vector和llvm::SmallVector之间有什么区别?什么时候用哪一个
What is the difference between std::vector and llvm::SmallVector? which one to use when?
我正在尝试了解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
。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 什么时候在C++中返回常量引用是个好主意
- 什么时候调用析构函数
- boost odeint什么时候真正调用观测者
- 编译器对数组声明大小的计算。什么时候发生?
- 什么时候最好在子进程中使用 CPU 或 I/O 密集型代码 [ C++ ]
- 您应该在什么时候创建自己的异常类型
- 我什么时候会默认(而不是删除)基类中的复制和移动操作
- 什么时候可以使用常量装饰调用我的重载函数?
- unordered_map什么时候返回 -1?
- QCoreApplication什么时候有效?
- sizeof(size_t) 和 sizeof(ptrdiff_t) 什么时候会有所不同?
- 什么时候用指针调用C++类构造函数
- 我不明白在这个例子中什么时候调用构造函数
- 如果真的需要std::move,我们应该什么时候声明右值refs
- P1008("prohibit aggregates with user-declared constructors")在实践中什么时候有用?
- 程序什么时候会创建多个堆
- 调用boost.asio的异步函数时,线程是什么时候创建的
- std::vector和llvm::SmallVector之间有什么区别?什么时候用哪一个
- "Thing thing;"和"Thing thing = Thing();"有什么区别,什么时候应该使用一个而不是另一个?