Я пытаюсь оптимизировать время сборки, используя внешние шаблоны, потому что у меня есть много сгенерированных заголовков, которые содержат typedef для класса шаблона.
Класс шаблона
// TypeID.h
template <typename T>
class TypeID
{
public:
TypeID(/* <some parameters> */);
bool isNull() const;
// ... many other methods
};
template <typename T>
TypeID<T>::TypeID(/* <some parameters> */)
{
// impl
}
template <typename T>
bool TypeID<T>::isNull() const
{
// impl
}
// same for the rest of the methods
Примерсгенерированного заголовка
// NamedID.h
#include "TypeID.h"
typedef TypeID</* some type */> NamedID;
Существует много (~ 2k) заголовков, таких как NamedID, с различными типами, и они включены в проект.
Я изменил генератор кода, чтобы добавить эту строку вышеtypedef:
extern template class TypeID</* some type */>;
, и в дополнение к заголовочным файлам теперь также генерируется cpp, где все внешние шаблоны имеют соответствующий
template class TypeID</* some type */>;
из-за количества заголовков исколько раз они использовались в проекте, я ожидал большой разницы во времени компиляции (по крайней мере, что-то заметное), но разницы нет.
Я провел несколько прогонов сборки с этим изменением и без него, и всеони занимают 2 ч 30 м +/- 2 м.
Я правильно это реализовал? Я ожидаю слишком многого?
Мое окружение:
- RHEL 7.7
- GCC 8.3.1
- CMake + ninja, нет ccache, нетмороженое / distcc