实现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) { }
Run Code Online (Sandbox Code Playgroud)
假设的不同实现可以做到:
SmallVector() : SmallVectorImpl<T>(&Storage, T * sizeof(N)) { }
Run Code Online (Sandbox Code Playgroud)
并且SmallVectorTemplateCommon不会有FirstEl会员.实施的优势是什么?
拆分存储避免了在"大小擦除"类型中存储内联容量(或"小"位)SmallVectorImpl.
SmallVectorImpl<T>可用于引用任何SmallVector<T, N>并支持其上的所有向量操作.当底层存储增长时,free如果指针使用内联容量,则无法传递指针.将当前存储的地址与内联容量的第一个元素进行比较非常方便,并在SmallVector中节省了一些内存.