Оптимизация времени сборки с использованием внешних шаблонов - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь оптимизировать время сборки, используя внешние шаблоны, потому что у меня есть много сгенерированных заголовков, которые содержат 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
...