Articulo de referencia

Encabezado precompilado

En programación informática , un encabezado precompilado ( PCH ) es un archivo de encabezado ( C o C++ ) compilado en una forma intermedia que el compilador procesa más rápidame...

En programación informática , un encabezado precompilado ( PCH ) es un archivo de encabezado ( C o C++ ) compilado en una forma intermedia que el compilador procesa más rápidamente . El uso de encabezados precompilados puede reducir significativamente el tiempo de compilación , especialmente cuando se aplica a archivos de encabezado grandes, archivos de encabezado que incluyen muchos otros archivos de encabezado o archivos de encabezado que se incluyen en muchas unidades de traducción . La idea de los encabezados precompilados fue fundamental para el desarrollo de los módulos de C++ .

Razón fundamental

En los lenguajes de programación C y C++ , un archivo de cabecera es un archivo cuyo texto puede ser incluido automáticamente en otro archivo fuente por el preprocesador de C mediante el uso de una directiva de preprocesador en el archivo fuente.

Los archivos de cabecera a veces pueden contener grandes cantidades de código fuente (por ejemplo, los archivos de cabecera windows.hde Cocoa/Cocoa.hMicrosoft Windows y OS X , respectivamente). Esto es especialmente cierto con la aparición de grandes bibliotecas de cabecera que hacen un uso extensivo de plantillas , como Eigen , Boost y POCO . Estas se escriben casi en su totalidad como archivos de cabecera que el usuario #includecompila, en lugar de enlazarse en tiempo de ejecución. Por lo tanto, cada vez que el usuario compila su programa, esencialmente también recompila numerosas bibliotecas de cabecera. (Estas se precompilarían en objetos compartidos o bibliotecas de enlace dinámico en bibliotecas que no son de cabecera).

Para reducir los tiempos de compilación, algunos compiladores permiten compilar los archivos de cabecera en un formato que el compilador procesa más rápidamente. Este formato intermedio se conoce como cabecera precompilada y suele estar almacenado en un archivo con la extensión .pcho similar, como por ejemplo .gchen la Colección de Compiladores GNU .

Uso

Por ejemplo, dado un archivo C++ source.cppque incluye header.hpp:

//header.hpp ...
//source.cpp #include "header.hpp" ...

Cuando se compila source.cpppor primera vez con la función de encabezado precompilado activada, el compilador generará un encabezado precompilado header.pch. La próxima vez, si la marca de tiempo de este encabezado no ha cambiado, el compilador puede omitir la fase de compilación relacionada con header.hppy en su lugar usar header.pchdirectamente.

Implementaciones comunes

Microsoft Visual C y C++

Microsoft Visual C++ (versión 6.0 y posteriores ) puede precompilar cualquier código, no solo los encabezados. [ 1 ] Puede hacerlo de dos maneras: precompilando todo el código hasta un archivo cuyo nombre coincida con la opción o (cuando se especifica sin ninguna ) precompilando todo el código hasta la primera aparición de en el código [ 2 ] [ 3 ] La salida precompilada se guarda en un archivo con el nombre dado a la opción, con una extensión, o en un archivo con el nombre proporcionado por la opción. [ 3 ] La opción, subordinada a la opción si se usan juntas, hace que el compilador utilice el código ya precompilado de dicho archivo. [ 3 ]/Ycfilename/Ycfilename#pragma hdrstopfilename/Yc.pch/Fpfilename/Yu/Yc

pch.h(nombrado stdafx.hantes de Visual Studio 2017 [ 4 ] ) es un archivo generado por el asistente del IDE de Microsoft Visual Studio , que describe archivos de inclusión estándar del sistema y específicos del proyecto que se usan con frecuencia pero que casi nunca cambian.

Las siglas afx corresponden stdafx.ha extensiones del marco de aplicación . AFX era la abreviatura original de Microsoft Foundation Classes (MFC). Si bien el nombre stdafx.h se usaba por defecto en los proyectos MSVC anteriores a la versión 2017, se puede especificar manualmente cualquier nombre alternativo.

Los compiladores compatibles precompilarán este archivo para reducir los tiempos de compilación generales. Visual C++ no compilará nada antes de la #include "pch.h"línea en el archivo fuente, a menos que la opción de compilación /Yu'pch.h'esté desactivada (por defecto); asume que todo el código fuente hasta esa línea inclusive ya está compilado.

GCC

GCC (versión 3.4 y posteriores) admite archivos de cabecera precompilados . Su enfoque es similar al de VC y compiladores compatibles. GCC guarda versiones precompiladas de los archivos de cabecera con el .gchsufijo " ". Al compilar un archivo fuente, el compilador comprueba si este archivo se encuentra en el mismo directorio y lo utiliza si es posible.

GCC solo puede usar la versión precompilada si se mantienen las mismas opciones de compilación que al compilar el archivo de cabecera, y solo puede usar una como máximo. Además, solo se pueden colocar instrucciones de preprocesador antes del archivo de cabecera precompilado (ya que este debe incluirse, directa o indirectamente, a través de otro archivo de cabecera normal, antes de cualquier código compilable).

GCC identifica automáticamente la mayoría de los archivos de cabecera por su extensión. Sin embargo, si esto falla (por ejemplo, debido a extensiones de cabecera no estándar), -xse puede usar el interruptor para asegurar que GCC trate el archivo como una cabecera.

sonido metálico

El compilador Clang añadió soporte para PCH en Clang 2.5 / LLVM 2.5 de 2009. [ 5 ] El compilador tokeniza el código fuente de entrada y realiza análisis sintácticos y semánticos de los encabezados, escribiendo el árbol de sintaxis abstracta (AST) y la tabla de símbolos generados internamente por el compilador en un archivo de encabezado precompilado. [ 6 ]

El esquema de encabezados precompilados de clang, con algunas mejoras como la capacidad de que un encabezado precompilado haga referencia a otro encabezado precompilado de uso interno, también constituye la base de su mecanismo de módulos. [ 6 ] Utiliza el mismo formato de archivo de bitcode que emplea LLVM , encapsulado en secciones específicas de clang dentro de archivos Common Object File Format o Extensible Linking Format . [ 6 ]

C++Builder

En la configuración predeterminada del proyecto, el compilador C++Builder genera implícitamente encabezados precompilados para todos los encabezados incluidos por un módulo fuente hasta que #pragma hdrstopse encuentra la línea. [ 7 ] : 76 Los encabezados precompilados se comparten para todos los módulos del proyecto si es posible. Por ejemplo, al trabajar con la Biblioteca de Componentes Visuales , es común incluir vcl.hprimero el encabezado que contiene la mayoría de los archivos de encabezado VCL de uso común. Por lo tanto, el encabezado precompilado se puede compartir entre todos los módulos del proyecto, lo que reduce drásticamente los tiempos de compilación.

Además, C++Builder puede configurarse para usar un archivo de encabezado específico como encabezado precompilado, de forma similar al mecanismo que proporciona Visual C++.

C++Builder 2009 introduce un "Asistente para encabezados precompilados" que analiza todos los módulos fuente del proyecto en busca de archivos de encabezado incluidos, los clasifica (es decir, excluye los archivos de encabezado si forman parte del proyecto o no tienen una directiva Include guard ) y genera y prueba automáticamente un encabezado precompilado para los archivos especificados.

Encabezados pretokenizados

Un encabezado pretokenizado (PTH) es un archivo de encabezado almacenado en un formato que ha sido sometido a análisis léxico , pero sin operaciones semánticas. PTH está presente en Clang antes de que admitiera PCH, y también se ha probado en una rama de GCC. [ 8 ]

En comparación con un mecanismo PCH completo, PTH tiene las ventajas de la independencia del lenguaje (y dialecto), ya que el análisis léxico es similar para los lenguajes de la familia C, y la independencia de la arquitectura, puesto que se puede utilizar el mismo flujo de tokens al compilar para diferentes arquitecturas de destino. [ 9 ] Sin embargo, tiene la desventaja de no ir más allá del análisis léxico simple, lo que requiere que se realice un análisis sintáctico y semántico del flujo de tokens con cada compilación. Además, el tiempo de compilación aumenta linealmente con el tamaño, en tokens léxicos, del archivo pretokenizado, lo que no ocurre necesariamente con un mecanismo de precompilación completo (PCH en clang permite el acceso aleatorio). [ 9 ]

El mecanismo de pretokenización de Clang incluye varios mecanismos menores para ayudar al preprocesador: almacenamiento en caché de la existencia de archivos e información de fecha y hora, y registro de protecciones de inclusión para que el código protegido pueda omitirse rápidamente. [ 9 ]

Módulos

Los módulos, introducidos en C++20 , funcionan de manera similar a los encabezados precompilados y se compilan en archivos .pcm (módulo precompilado), similares a los archivos .pch para los encabezados precompilados. Los módulos permiten una mayor encapsulación y control de los símbolos exportados y, al igual que los encabezados precompilados, permiten una compilación más rápida. [ 10 ] Los módulos son gestionados completamente por el compilador en lugar del preprocesador y, por lo tanto, a diferencia de los encabezados precompilados, no pueden exportar macros debido a que se gestionan después del paso de preprocesamiento.

Desde C++23 , la biblioteca estándar de C++ se proporciona como un módulo. [ 11 ]

Véase también

Notas

Referencias

  1. "Creación de archivos de encabezado precompilados" . MSDN . Microsoft. 2015. Archivado del original el 28 de marzo de 2018. Consultado el 28 de marzo de 2018 .
  2. "Dos opciones para precompilar código" . MSDN . Microsoft. 2015. Consultado el 28 de marzo de 2018 .
  3. 1 2 3 "/Yc (Crear archivo de encabezado precompilado)" . MSDN . Microsoft. 2015. Consultado el 28 de marzo de 2018 .
  4. "¿Puedo usar #include "pch.h" en lugar de #include "stdafx.h" como encabezado de precompilación en Visual Studio C++?" . Stack Overflow .
  5. "Notas de la versión LLVM 2.5" . releases.llvm.org .
  6. 1 2 3 El equipo de Clang (2018). "Interiores de los módulos y encabezados precompilados" . Documentación de Clang 7. Recuperado el 28 de marzo de 2018 .
  7. Swart, Bob (2003). Guía del desarrollador de Borland C++ Builder 6. Sams Publishing. ISBN 9780672324802.
  8. "pph - Wiki de GCC" . gcc.gnu.org .
  9. 1 2 3 El equipo de Clang (2018). "Encabezados pretokenizados (PTH)" . Documentación de Clang 7. Archivado del original el 22 de marzo de 2018. Recuperado el 28 de marzo de 2018 .
  10. cppreference.com (2025). "Módulos (desde C++20)" . Consultado el 20 de febrero de 2025 .
  11. cppreference.com (2025). "Biblioteca estándar de C++" . Consultado el 20 de febrero de 2025 .
  • El cuidado y mantenimiento de los encabezados precompilados
  • Encabezados precompilados con GCC
  • Fractal eXtreme: Encabezados precompilados