Реализация llvm::SmallVector<T,N> разделяется между многими типами:
-
llvm::SmallVectorBaseсодержит 3void*для начала, конца и емкости. -
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. В чем преимущество реализации в ее нынешнем виде?