文件位於 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]]
其它幾個基類不復雜,內容略去。