c++ visual-c++ precompiled-headers

c++ - ¿Qué poner en el encabezado precompilado?(MSVC)



visual-c++ precompiled-headers (4)

¿Cuáles son los mejores candidatos para un archivo de encabezado precompilado? ¿Puedo poner encabezados STL y Boost allí, a pesar de que tienen plantillas? ¿Y eso reducirá los tiempos de compilación? Además, ¿cuáles son las mejores configuraciones de IDE para reducir los tiempos de compilación?


Coloque cualquier cosa en el encabezado precompilado que la mayoría de los archivos .cpp en ese proyecto incluiría de todos modos. Esto va para cualquier archivo de encabezado, realmente. Esto permite que el compilador analice estos archivos una vez, y luego reutilice esa información en todos los archivos .cpp en el mismo proyecto.


He escrito un artículo sobre técnicas que reducen el tiempo de compilación. Entre estas técnicas, se puede encontrar una publicación sobre el encabezado precompilado y su aplicación here . También tiene una sección sobre mejores prácticas que puede encontrar interesante. Se incluyen scripts CMake que lo manejan de forma transparente.


La respuesta rápida: los encabezados STL y Boost pertenecen realmente al archivo de encabezado precompilado, aunque estos archivos de encabezado definen las clases de plantilla.

Al generar un archivo de encabezado precompilado, un compilador analiza el texto del encabezado (¡una tarea importante!) Y lo convierte en un formato binario que está optimizado para el beneficio del compilador.

Aunque se crearán instancias de las clases de plantilla cuando se compilan otros archivos .cpp, se crearán instancias de la información en el encabezado precompilado, que es significativamente más rápido de leer para el compilador.

(más tarde adición)

Una cosa que no debe incluir en un encabezado precompilado son los archivos que son parte de su proyecto y se cambian con frecuencia, incluso si cada archivo .CPP solo incluye estos archivos.

La razón es esta: la generación del encabezado precompilado puede llevar mucho tiempo, porque las bibliotecas de boost, stl y windows son muy grandes.

Es posible que tenga un archivo simple (por ejemplo, "StringDefs.h") que todo lo que utiliza. Si StringDefs.h está incluido en stdafx.h, y un desarrollador toca StringDefs.h, entonces cada desarrollador tiene que esperar hasta que se recompile todo el encabezado precompilado . Sería mucho más rápido si StringDefs.h quedara fuera del encabezado precompilado y se analizara junto con cada archivo .CPP.


Una adición a la respuesta de Andrew Shepherd. Utilice el encabezado precompilado para los archivos de encabezado que son externos a su proyecto, para los archivos que cambian con poca frecuencia. Si está cambiando los archivos de encabezado en el proyecto actual todo el tiempo, probablemente no valga la pena precompilarlos.