学习 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 简写如下:
* 注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]]
参见: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(14) SmallPtrSet
- 学习 LLVM(9) SmallVector 类
- 实战c++中的vector系列--vector<unique_ptr<>>初始化(全部权转移)
- 【C++ Primer】【学习笔记】【第九章】顺序容器之:vector容器的自增长
- C++ Standard Stl -- SGI STL源码学习笔记(07) stl_vector 与 一些问题的细化 3 resize函数剖析
- 【STM32 .Net MF开发板学习-03】TinyGUI绘图示例
- boost::smart_ptr学习笔记
- Java集合源码学习笔记(五)ArrayList,LinkedList,Vector和Hashtable,HashMap的比较
- RTX51 Tiny实时操作系统学习笔记—初识RTX51 Tiny
- STL源码学习——Vector(向量)
- 关于C++的vector的实例学习
- LLVM学习笔记(12)
- 【STL容器入门学习1】vector容器摸索
- ACE学习手记-----智能指针(ACE_Intrusive_Auto_Ptr)
- STL学习笔记 ---- 神秘的auto_ptr
- 学习 LLVM(7) PointerUnion 类
- java学习随笔--- 捣蛋vector
- 代码注释法学习智能指针intrusive_ptr
- vector 、map 、iterator 之学习笔记
- C++学习:vector用法