2009-08-27 4 views

risposta

10

L'unico vantaggio potenziale per le intestazioni precompilate è che se le build sono troppo lente, le intestazioni precompilate potrebbero velocizzarle. Potenziali:

  • Ulteriori dipendenze di Makefile per ottenere il diritto; se hanno torto, costruisci velocemente la cosa sbagliata. Non bene.

  • In linea di principio, non tutte le intestazioni possono essere precompilate. (Pensa di inserire alcuni # define prima di un #include.) Quindi in quali casi gcc ha effettivamente ragione? Quanto ti vuoi fidare di questa funzionalità all'avanguardia.

Se la vostra generazioni sono abbastanza veloce, non v'è alcun motivo per utilizzare intestazioni precompilate. Se la vostra generazioni sono troppo lento, mi piacerebbe prendere in considerazione

  • L'acquisto di hardware più veloce, che è a buon mercato rispetto agli stipendi

  • utilizzando uno strumento come AT & T nmake o come ccache (Dirk è proprio sulla) , entrambi utilizzano tecniche affidabili per evitare ricompilazioni.

+3

In realtà gcc gestisce bene PCH. Se esiste una #define prima di includere il pch, il pch non viene semplicemente utilizzato e vengono utilizzati gli inclusi normali. Potresti anche considerare di aggiornarti un po ', PCH esiste ormai da circa cinque anni in gcc e non è più esattamente all'avanguardia. – hirschhornsalz

+0

Oltre a ccache, si può anche usare distcc su un certo numero di macchine. –

+0

@drhirsch: sono un utente attento di gcc. Ogni volta che c'è una nuova versione, qualcosa si rompe. Per me, cinque anni sono ancora sanguinanti. –

5

Il frontend di ccache caching su gcc, g ++, gfortran, ... funziona perfettamente per me. Come dice il suo sito web

ccache è una cache del compilatore. Funziona come un pre-processore di cache per i compilatori C/C++ , utilizzando lo switch -E compiler e un hash per rilevare quando una compilazione può essere soddisfatta dalla cache . Ciò si traduce spesso in un aumento da 5 a 10 volte nelle compilation comuni.

Su Debian/Ubuntu, basta fare 'apt-get install ccache' e creare soft-link a, diciamo, /usr/local/bin con nomi gcc, g++, gfortran, c++, ... quel punto a /usr/bin/ccache.

[EDIT ] Per rendere più esplicito questo in risposta ad alcuni dei primi commenti: Questo fornisce essenzialmente le intestazioni precompilate e fonti memorizzando una grande fetta della fase di compilazione. Quindi usa un'idea simile alle intestazioni precompilate e la porta avanti. Le accelerazioni possono essere drammatiche - un fattore da 5 a 10 come dice il sito web.

+6

-1: Non sono sicuro che questo abbia qualcosa a che fare con le intestazioni precompilate. – quamrana

+6

Questo non ha nulla a che fare con le intestazioni precompilate. –

+3

@ Martin: rende inutili le intestazioni precompilate. Velocizza la compilazione, anche senza intestazioni precompilate. – elcuco

8

Non posso parlare con GNU/gcc/linux, ma ho affrontato con intestazioni precompilate in VS2005:

Pro:

  • Più Siti tempo di compilazione quando si dispone di grandi intestazioni che molti moduli includono.
  • Funziona bene sulle intestazioni (diciamo da una terza parte) che cambiano raramente molto .

Contro:

  • Se li usate per le intestazioni che cambiano molto, può aumentare il tempo di compilazione.
  • Può essere poco pratico da configurare e gestire.
  • In alcuni casi le modifiche alle intestazioni vengono ignorate apparentemente se non si impone la compilazione dell'intestazione precompilata.
+0

L'OP ha chiesto informazioni su GNU/Linux. –

+7

Tuttavia, pro e contro si applicano anche a gcc. –

4

Per la C normale, evitare le intestazioni precompilate. Come dici tu, possono potenzialmente causare problemi, e il tempo di pre-elaborazione è davvero piccolo rispetto alla compilazione normale.

Per C++, le intestazioni precompilate possono potenzialmente risparmiare molto tempo, poiché le intestazioni C++ contengono spesso un codice modello di grandi dimensioni la cui compilazione è costosa. Non ho esperienza pratica con loro, quindi ti consiglio di misurare quanti risparmi nella compilazione ottieni nel tuo progetto.Per fare ciò, compilare l'intero progetto con intestazioni precompilate una volta, quindi eliminare un singolo file oggetto e misurare il tempo necessario per ricompilare il file.

0

Sto usando PCH in un progetto Qt, che usa CMake come sistema di compilazione, e fa risparmiare un sacco di tempo. Ho preso alcuni script di cmake PCH, che necessitavano di qualche ritocco, dato che erano piuttosto vecchi, ma in genere era più facile da configurare di quanto mi aspettassi. Devo aggiungere che non sono un esperto di cmake.

Attualmente includo una parte importante di Qt (QtCore, QtGui, QtOpenGL) e alcune intestazioni stabili contemporaneamente.

Pro:

  • Per le classi Qt, non sono necessari dichiarazioni in avanti, e, naturalmente, non comprende.
  • Veloce.
  • Facile da configurare.

Contro:

  • Non è possibile includere il PCH includono nelle intestazioni. Questo non è un grosso problema, eccetto che usi Qt e lasci che il sistema di compilazione traduca i file moc in modo separato, il che è esattamente la mia configurazione. In questo caso, è necessario # includere le intestazioni qt nelle intestazioni, poiché i moc sono generati dalle intestazioni. La soluzione consisteva nel mettere ulteriori guardie intorno al #include nell'intestazione.
+0

Da quasi tutti quelli con cui ho parlato, "Facile da configurare" è il più lontano possibile dal consenso. Puoi elaborare? – Catskul

+0

Mi spiace, ma non posso formattare i commenti, quindi questo viene avvolto. In CMakeLists.txt ho aggiunto due righe 'include (PCHSupport)' e 'ADD_PRECOMPILED_HEADER (myprojectname $ {CMAKE_SOURCE_DIR} /pch.h)'. Nei file di implementazione del progetto utilizzo un '#include ' all'inizio. A causa delle particolarità dei sistemi di compilazione qt che usano automoc, devo includere pch.h nelle intestazioni per, questo funziona con protezioni aggiuntive aggiuntive. Quest'ultima era in realtà la parte più difficile da capire, ma l'ho fatto funzionare in meno di un'ora, quindi ritengo che sia "facile". – hirschhornsalz