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)
risposta
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.
Questo è un punto giusto: la modifica frequente dei file potrebbe rallentare i tempi di costruzione, in generale. – Andy
È possibile avere solo 1 file di intestazione precompilato per file .cpp, ma è possibile avere più intestazioni precompilate nel progetto. –
Non devi solo aspettare che il PCH ricompaia, ma anche per ogni file che lo utilizza. –
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.
Non sono d'accordo, e ho scritto una sezione in più nella mia risposta per spiegare perché. Le intestazioni precompilate –
dovrebbero * mai * includere intestazioni locali del progetto – Tom
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
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.
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.
- 1. Libreria dex precompilata
- 2. Cosa inserire nel ViewModel
- 3. MSVC oggetto layout Quirk
- 4. Infinity in MSVC++
- 5. Errore ODR in MSVC?
- 6. __VA_ARGS__ espansione usando MSVC
- 7. Espansione macro variadic MSVC++
- 8. MSVC tipo const enum
- 9. Entity Framework: query precompilata per Enumerable.Contains
- 10. MSVC _M_X64 Chiarificazione macro predefinita
- 11. Equivalente di open_memstream per MSVC
- 12. Cosa devo inserire nella directory di destinazione?
- 13. cosa posso inserire prima del caricamento?
- 14. msvc ha l'analogico di gcc's ({})
- 15. Usa Clang con MSVC 2010
- 16. Qual è la differenza tra "Crea intestazione precompilata" (/ Yc) e "Usa intestazione precompilata" (/ Yu) in Visual Studio?
- 17. problema di ottimizzazione Odd sotto MSVC
- 18. Impostazione del runtime MSVC in CMake
- 19. Java String.split passare in regex precompilata per performance ragiona
- 20. perl: come ottenere la regex originale dalla versione precompilata?
- 21. Come fare clang -E omettere di intestazione precompilata
- 22. Impossibile includere Winsock2.h in MSVC 2010
- 23. MSVC++: stranezza con unsigned int e troppopieno
- 24. "Escape" e "Clobber" equivalenti in MSVC
- 25. Collegamento a MSVC DLL da MinGW
- 26. Errore di ereditarietà virtuale in MSVC
- 27. È sicuro disabilitare l'avviso MSVC C4482?
- 28. __attribute __ ((formato (printf, 1, 2))) per MSVC?
- 29. C++: typedefs richiamata con __stdcall in MSVC
- 30. stdin come file di input per MSVC
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