Voici quelques astuces pour réduire les temps de compilation, qui peuvent parfois se compter en minutes voire en heures sur des projets
de taille conséquente.
1/ Utiliser les déclarations anticipées
Si dans un en-tête vous ne déclarez qu'un pointeur ou une référence sur une classe, alors vous n'avez pas besoin d'inclure son en-tête :
une déclaration anticipée suffit.
MaClasse.h
class Classe1;
class Classe2;
class MaClasse
{
void Something(const Classe1& c);
Classe2* c2;
}; |
MaClasse.cpp
#include "Classe1.h"
#include "Classe2.h"
void MaClasse::Something(const Classe1& c)
{
} |
Ainsi lorsque Classe1 ou Classe2 sera modifiée, seul MaClasse.cpp sera recompilé. Sans cette astuce, vous auriez dû recompiler
(inutilement) tous les fichiers incluant MaClasse.h. L'élimination des dépendances inutiles est essentielle pour améliorer les temps de
compilation.
2/ Utiliser l'idiome enveloppe-lettre (pimpl idiom)
Le principe de cet idiome est de séparer l'interface publique d'une classe de son implémentation.
MaClasse.h (interface)
class MaClasseImpl;
class MaClasse
{
public :
void Set(int);
int Get() const;
private :
MaClasseImpl* pImpl;
}; |
MaClasse.cpp
#include "MaClasseImpl.h"
void MaClasse::Set(int x)
{
pImpl->Set(x);
}
int MaClasse::Get() const
{
return pImpl->Get();
} |
MaClasseImpl.h (implémentation)
class MaClasseImpl
{
public :
void Set(int);
int Get() const;
private :
int val;
}; |
MaClasseImpl.cpp
#include "MaClasseImpl.h"
void MaClasseImpl::Set(int x)
{
val = x;
}
int MaClasseImpl::Get() const
{
return val;
} |
Ainsi, seule une modification de l'interface de MaClasse entraînera une recompilation des fichiers qui en dépendent. Un changement dans
son implémentation n'entraînera la recompilation que de deux fichiers au maximum : MaClasse.cpp et MaClasseImpl.cpp.
Comme vous le voyez dans cet exemple, MaClasse est ici limitée à son interface publique, toutes ses données privées et protégées sont
cachées dans MaClasseImpl. C'est un autre avantage de ce procédé : en plus de réduire les dépendances et d'accélérer la compilation,
l'idiome pimpl permet de ne rendre visible pour les clients d'une classe que son interface publique.
3/ Utiliser les en-têtes précompilés
En plus des techniques citées ci-dessus, certains environnements de développement comme VC++ et BCB proposent d'utiliser un en-tête
précompilé. Pour en tirer partie il faut :
- Activer son utilisation dans les options du projet.
- Inclure dans l'en-tête précompilé (par défaut, stdafx.h sous VC++) tous les en-têtes que vous ne modifierez pas ou peu souvent
(en-têtes standards, de bibliothèques externes, ...).
- Inclure l'en-tête précompilé dans toutes les unités de traduction (les .cpp) du projet.
Attention, si vous y incluez un en-tête subissant des modifications fréquentes cela aura l'effet inverse : à chaque modification de
celui-ci vous aurez droit à une recompilation complète.
|