为什么llvm::SmallVector拆分其存储

Why does llvm::SmallVector split its storage?

本文关键字:存储 拆分 SmallVector llvm 为什么      更新时间:2023-10-16

llvm::SmallVector<T,N>的实现分为许多类型:

  • llvm::SmallVectorBase 包含 3 个void*的开始、结束和容量。
  • llvm::SmallVectorTemplateCommon<T>保存小存储的第一个元素,作为适当对齐和大小的char阵列。
  • llvm::SmallVector<T,N>保存小存储的下N-1个元素,作为适当对齐和大小的char阵列的数组。

为什么存储被拆分在两个类模板之间,而不是让派生最多的类(SmallVector<T,N>(简单地存储所有N元素,并将指向此存储的指针传递到基类?也就是说,当前默认构造函数执行以下操作:

SmallVector() : SmallVectorImpl<T>(N) { }

假设不同的实现可以执行以下操作:

SmallVector() : SmallVectorImpl<T>(&Storage, T * sizeof(N)) { }

SmallVectorTemplateCommon不会有FirstEl成员。目前实施的优势是什么?

拆分

存储可避免将内联容量(或"小"位(存储在"大小擦除"类型SmallVectorImpl中。

SmallVectorImpl<T>可用于引用任何SmallVector<T, N>并支持其上的所有向量操作。当基础存储增长时,指针无法传递给free是否正在使用内联容量。将当前存储的地址与内联容量的第一个元素进行比较很方便,并且可以在 SmallVector 中节省一些内存。