美文网首页
[LLVM数据结构]SmallVector

[LLVM数据结构]SmallVector

作者: HAPPYers | 来源:发表于2019-09-29 15:52 被阅读0次

LLVM SmallVector

简介

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

代码定义

头文件位于llvm/ADT/SmallVector.h

文件中定义有:

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

概述

模板类 SmallVector<T>SmallVectorImpl 派生:

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

实现机理

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

特化版本

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

设计目的

  • 为了优化内存的分配,针对元素数一般小于 N 的时候,能够不用昂贵的内存分配、释放操作。
  • 针对 POD 也有构造、移动、析构等优化。也即为了得到最佳程序性能而设计。

相关文章

  • [LLVM数据结构]SmallVector

    LLVM SmallVector 简介 SmallVector 是一个动态可变长数组,为数组比较小的情况进行了优...

  • LLVM

    LLVM 什么是LLVM? 官网:https://llvm.org/ The LLVM Project is a ...

  • iOS_LLVM

    LLVM 官网:https://llvm.org/[https://llvm.org/] The LLVM Pro...

  • iOS 逆向 day 18 GCC LLVM Clang

    一、LLVM 1. 什么是 LLVM 官网:https://llvm.org/ The LLVM Project ...

  • 浅谈LLVM

    何为LLVM 在LLVM的官网(https://llvm.org/[https://llvm.org/])中写到T...

  • iOS逆向-day10:LLVM 编译器

    一、LLVM的简单介绍 1.1、什么是LLVM官网:https://llvm.org/LLVM官网解释:The L...

  • 初识LLVM&Clang-开发Xcode插件

    初识LLVM&Clang-开发Xcode插件 LLVM Xcode现在使用的编译器就是LLVM。LLVM比以前使用...

  • LLVM 初始 ①

    什么是LLVM 官网:https://llvm.org/ The LLVM Project is a collec...

  • LLVM 工具

    llvm-dis llvm-dis 是一个反汇编工具,通过 LLVM 字节码文件(.bc)得到 LLVM 汇编文件...

  • LLVM(1)LLVM了解

    一、什么是LLVM 1、官网:https://llvm.org/The LLVM Project is a col...

网友评论

      本文标题:[LLVM数据结构]SmallVector

      本文链接:https://www.haomeiwen.com/subject/phmfpctx.html