学习 LLVM(9) SmallVector 类

文件位于 llvm/include/llvm/[[ADT]]/SmallVector.h  返回到 [[llvm]], [[Header]]数组

文件中定义有:
* 类 [[SmallVectorBase]] -- 不含模板部分的公共基类,提供给各个 SmallVectorXXX<> 作基类
* 模板类 [[SmallVectorTemplateCommon]],派生自 SmallVectorBase
* 模板类 [[SmallVectorTemplateBase]],派生自 SmallVectorTemplateCommon<T>
** SmallVectorTemplateBase<T, true> 特化版本,针对 POD 数据优化。
* 模板类 [[SmallVectorImpl]],派生自 SmallVectorTemplateBase<T, is_pod>
** swap() 模板方法,赋值操做符重载。
* 模板类 [[SmallVector]],派生自 SmallVectorImpl<T>
** SmallVector<T, 0> 特化版本
函数

模板类 SmallVector 定义在文件 llvm/include/llvm/[[ADT]]/[[SmallVector.h]] 中。性能

== 说明 ==
SmallVector 是一个动态可变长数组,为数组比较小的状况进行了优化。它在类中(实际是在末尾)包含 N 个元素(in-place,在位元素),当元素数量少于这个 N 的时候,数据保存在类中,从而避免了堆的内存分配。这样在数组较小的时候很快很节省,变大了也可以支持。优化

SmallVector - This is a 'vector' (really, a variable-sized array), optimized
for the case when the array is small.  It contains some number of elements
in-place, which allows it to avoid heap allocation when the actual number of
elements is below that threshold.  This allows normal "small" cases to be
fast without losing generality for large inputs.this

Note that this does not attempt to be exception safe.设计

== 概述 ==
模板类 SmallVector<T> 从 SmallVectorImpl 派生:code

template <typename T, unsigned N>  // 注1
class SmallVector : public SmallVectorImpl<T> {
   U InlineElts[NUM];  // 注2 
 
   this()  // 多个构造,用计算出来的可容纳 T 元素的数量 NumTsAvailable 调用基类构造。
}

* 注1:N 表示要 in-place 容纳 N 个 T 元素。
* 注2:根据 N 计算出须要多少个 U 的空间可以存放下 N 个 T 元素,空间需求为 N*sizeof(T)。计算结果为 NUM。原代码中有几个 enum 用于作此计算:
** NumInlineEltsElts -- InlineElts[] 数组大小,以使得有足够的空间容纳 N 个 T 元素。
** NumTsAvailable -- 表示实际申请的空间能够存放的 T 类型元素的数量。
* 基本功能都在基类中实现了,所以此类比较简单。参见 [[SmallVectorImpl]]orm

== 实现机理 ==
SmallVector 使用在类里面的空间(in-place空间)保存 N个 T 元素。当 push 更多元素的时候,grow() 函数将从堆中申请空间容纳更多元素。这种实现优化了当大部分状况元素数量都少于等于 N 的时候,不用从堆中分配内存,从而获得空间上的优化。内存

特化版本
* SmallVector 提供针对 N == 0 的特化版本,保证在不完整的 T 类型(incomplete)时也能实例化(此时不须要访问 T 的成员变量)。element

设计目的:
* 我认为是为了优化内存的分配,针对元素数通常小于 N 的时候,可以不用昂贵的内存分配、释放操做。
* 针对 POD 也有构造、移动、析构等优化。也即为了获得最佳程序性能而设计。

参见:
* 派生自 [[SmallVectorImpl]]

其它几个基类不复杂,内容略去。

相关文章
相关标签/搜索