2009-03-27 22 views
37

Quali sono i migliori candidati per un file di intestazione precompilato? Posso inserire intestazioni STL e Boost lì, anche se hanno dei template? E questo ridurrà i tempi di compilazione? Inoltre, quali sono le migliori impostazioni IDE per ridurre i tempi di compilazione?Cosa inserire nell'intestazione precompilata? (MSVC)

+3

Preferisco non utilizzare PCH. I motivi sono (1) Mi piace che la prima inclusione in un file cpp sia la sua intestazione corrispondente in modo da sapere la compilazione dell'header (2) la mia esperienza è che la dipendenza con pch non è completamente affidabile, e questo fa sì che le build incrementali diventino inaffidabili in progetti molto grandi. Secondo me è più efficiente a conti fatti non usare pch e godere dei benefici di build incrementali affidabili. Questo potrebbe non essere più il caso con le versioni più recenti di Visual Studio - la mia esperienza con questo non è ancora sufficiente per giudicare. – Permaquid

risposta

47

La risposta rapida: le intestazioni STL e Boost appartengono effettivamente al file di intestazione precompilato, anche se questi file di intestazione definiscono le classi di template.

Quando si genera un file di intestazione precompilato, un compilatore analizza il testo dell'intestazione (un'attività significativa!) E lo converte in un formato binario ottimizzato per il beneficio del compilatore.

Anche se le classi template verranno istanziate quando vengono compilati altri file .cpp, verranno istanziati dalle informazioni nell'intestazione precompilata, che è significativamente più veloce da leggere per il compilatore.


(aggiunta successiva)

Una cosa che si dovrebbe non includere nella un'intestazione precompilata sono file che fanno parte del progetto e vengono cambiati di frequente, anche se ogni singolo file cpp include questi file.

Il motivo è questo: la generazione dell'intestazione precompilata può richiedere molto tempo, poiché le librerie boost, stl e windows sono molto grandi.

Si potrebbe avere un semplice file (ad esempio "StringDefs.h") che tutto utilizza. Se StringDefs.h è incluso in stdafx.h, e uno sviluppatore tocca StringDefs.h, quindi ogni sviluppatore deve attendere fino a quando l'intestazione precompilata completa l' ricompila. Sarebbe molto più veloce se StringDefs.h fosse stato escluso dall'intestazione precompilata e analizzato insieme a ciascun file .CPP.

+0

Questo è un punto giusto: la modifica frequente dei file potrebbe rallentare i tempi di costruzione, in generale. – Andy

+4

È possibile avere solo 1 file di intestazione precompilato per file .cpp, ma è possibile avere più intestazioni precompilate nel progetto. –

+1

Non devi solo aspettare che il PCH ricompaia, ma anche per ogni file che lo utilizza. –

-1

Inserire qualcosa nell'intestazione precompilata che la maggior parte dei file .cpp in quel progetto includa comunque. Questo vale per qualsiasi file di intestazione, davvero. Ciò consente al compilatore di analizzare questi file una sola volta e quindi riutilizzare tali informazioni in tutti i file .cpp nello stesso progetto.

+2

Non sono d'accordo, e ho scritto una sezione in più nella mia risposta per spiegare perché. Le intestazioni precompilate –

+0

dovrebbero * mai * includere intestazioni locali del progetto – Tom

+0

Ho lavorato a lungo su un progetto che ha seguito questo consiglio errato ed è molto inefficiente: ogni volta che si compila, tutto viene compilato per qualsiasi modifica. – Permaquid

6

Un'aggiunta alla risposta di Andrew Shepherd. Utilizzare l'intestazione precompilata per i file di intestazione esterni al progetto, per i file che cambiano di rado. Se stai cambiando i file header nel progetto corrente per tutto il tempo, probabilmente non vale la pena precompilarli.

3

Ho scritto un articolo sulle tecniche che riducono il tempo di compilazione. Tra queste tecniche è possibile trovare un post sull'intestazione precompilata e la sua applicazione here. Ha anche una sezione sulle migliori pratiche che potresti trovare interessante. Gli script CMake che gestiscono in modo trasparente sono inclusi.