您的位置:首页 > 其它

学习 LLVM(6) TinyPtrVector 类

2012-02-27 00:00 218 查看
TinyPtrVector.h 位于 llvm/include/llvm/ADT/

参见:http://llvm.org/docs/ProgrammersManual.html#dss_tinyptrvector

== 简介 ==
模板类 TinyPtrVector<Type> 是一个高度定制的集合类(微型指针向量容器),其优化为当元素数量为 0 或 1 的时候避免进行内存分配。它有两个主要的限制:1) 只能容纳指针类型;2)不能容纳空指针。

由于这个容器是高度定制的,所以很少使用。(检索了一下似乎有两个地方用到)

TinyPtrVector<Type> is a highly specialized collection class that is optimized to avoid allocation in the case when a vector has zero or one elements. It has two major restrictions: 1) it can only hold values of pointer type, and 2) it cannot hold a null pointer.

Since this container is highly specialized, it is rarely used.

== 实现机理 ==
模板类 TinyPtrVector 简写如下:

template <typename EltTy/*元素类型*/> class TinyPtrVector {
PointerUnion<EltTy, Vector*> Val; // 注2。实际元素,或指向更大的容器的指针

TinyPtrVector(), ~ // 构造与析构
begin(), end(), empty(), size(), [] 等 STL 标准容器的函数。
push_back(), front(), clear() 等方法。但没有 pop 方法,接口比较小一些。
}

* 注1:在包含 "llvm/ADT/TinyPtrVector.h" 之前需要包含 "llvm/ADT/ArrayRef.h"
* 注2:Vector 指的是 SmallVector<EltTy, 4> 类型。当一个元素存不下的时候,使用 SmallVector 存放。

以 push_back() 为例子研究:
* 如果 Val.isNull(),表示元素数量 == 0,此时使用 Val.PT1* 部分,设置为 EltTy*。元素数量现在变成 1.
* 如果现在有 1 个元素使用 Val.PT1* 保存着,则 new 一个 Vector() 类型,将原有的那 1 个元素和现在要 push_back 的,都放在 Vector 中,然后将 Vector* 存放在 Val.PT2* 中。
* 不是以上两种情况,则现在用 Val.PT2* 保存着 Vector*,加入到该数组末尾。

可能为简化 api,这个类没有提供 pop_xxx(), push_front() 等接口。这样也是合理的。

参见:
* [[PointerUnion]]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  LLVM