Los encabezados precompilados (PCH) son archivos especiales que ciertos compiladores pueden generar para un archivo .cpp. Lo que son es exactamente eso: código fuente precompilado. Son un código fuente que ha sido alimentado a través del compilador y construido en un formato dependiente del compilador.
PCH se utilizan comúnmente para acelerar la compilación. Coloca los encabezados comúnmente utilizados en el PCH, luego simplemente incluya el PCH. Cuando haces un #include
en el PCH, tu compilador no hace el trabajo habitual de #include. En su lugar, carga estos símbolos precompilados directamente en el compilador. No se ejecuta un preprocesador C++. No ejecuta un compilador de C++. No #incluye un millón de archivos diferentes. Se carga un archivo y los símbolos aparecen completamente formados directamente en el espacio de trabajo de su compilador.
Menciono todo eso porque los módulos son PCH en su forma perfecta. Los PCH son básicamente un truco gigante construido sobre un sistema que no permite módulos reales. El propósito de los módulos es, en última instancia, poder tomar un archivo, generar un archivo de módulo específico del compilador que contenga símbolos y, a continuación, otro archivo carga ese módulo según sea necesario. Los símbolos están precompilados, así que de nuevo, no es necesario #incluir un montón de cosas, ejecutar un compilador, etc. Su código dice, import thing.foo
, y aparece.
Mire cualquiera de los encabezados de biblioteca estándar derivados de STL. Tome <map>
por ejemplo. Las probabilidades son buenas de que este archivo sea gigantesco o tenga una gran cantidad de #inclusiones de otros archivos que hacen que el archivo resultante sea gigantesco. Eso es mucho análisis de C++ que tiene que suceder. Debe ocurrir para cada archivo .cpp que tiene #include <map>
en él. Cada vez que compila un archivo fuente, el compilador tiene que volver a compilar lo mismo. Encima. Y más. Y otra vez.
¿Cambia el <map>
entre compilaciones? No, pero tu compilador no puede saber eso. Entonces tiene que seguir compilando.Cada vez que toca un archivo .cpp, debe compilar cada encabezado que este archivo .cpp incluye. Aunque no tocó esos encabezados o archivos fuente que afectan esos encabezados.
Los archivos PCH fueron una forma de evitar este problema. Pero son limitados, porque solo son un truco. Solo puede incluir uno por archivo .cpp, porque debe ser lo primero que incluyan los archivos .cpp. Y dado que solo hay un PCH, si hace algo que cambie el PCH (como agregarle un nuevo encabezado), debe recompilar todo en ese PCH.
Los módulos no tienen esencialmente nada que ver con el compilador cruzado ABI (aunque tener uno de ellos sería bueno, y los módulos lo harían un poco más fácil definir uno). Su propósito fundamental es acelerar los tiempos de compilación.
El propósito fundamental va más allá de acelerar los tiempos de compilación .....: D –