La Unidad de Compilación Única ( SCU ) es una técnica de programación informática para los lenguajes C y C ++ , que reduce el tiempo de compilación de los programas que abarcan varios archivos. Específicamente, permite al compilador mantener los datos de los archivos de encabezado compartidos, las definiciones y las plantillas, de modo que no es necesario volver a crearlos para cada archivo. Es una instancia de optimización de programas . La técnica se puede aplicar a un programa completo o a algún subconjunto de archivos fuente; cuando se aplica a un programa completo, también se conoce como construcción unitaria .
Propósito
En el modelo de compilación C / C ++ (formalmente "entorno de traducción"), .c individual / Los archivos de origen .cpp se preprocesan en unidades de traducción , que luego el compilador traduce ( compila ) por separado en varios objetos ( .o o .obj ) archivos. Estos archivos de objeto se pueden vincular entre sí para crear un solo archivo ejecutable o biblioteca. Sin embargo, esto lleva a que se realicen múltiples pasadas en archivos de encabezado comunes, y con C ++, múltiples instancias de plantilla de las mismas plantillas en diferentes unidades de traducción.
La técnica de Unidad de Compilación Única utiliza directivas de preprocesador para "pegar" diferentes unidades de traducción juntas en tiempo de compilación en lugar de en tiempo de enlace. Esto reduce el tiempo de compilación general, debido a la eliminación de la duplicación, pero aumenta el tiempo de compilación incremental (el tiempo necesario después de realizar un cambio en cualquier archivo de origen único que se incluye en la Unidad de compilación única), debido a que requiere una reconstrucción completa de la toda la unidad si cambia algún archivo de entrada. Por lo tanto, esta técnica es apropiada para un conjunto de archivos de origen modificados con poca frecuencia con una superposición significativa (muchos o costosos encabezados o plantillas comunes), o archivos de origen que con frecuencia requieren una recompilación conjunta, como porque todos incluyen un encabezado o plantilla común que cambia con frecuencia. .
Otra desventaja de SCU es que es serial, compila todos los archivos fuente incluidos en secuencia en un proceso y, por lo tanto, no se puede paralelizar, como se puede hacer en una compilación separada (a través de distcc o programas similares). Por lo tanto, SCU requiere una partición explícita (partición manual o "fragmentación" en varias unidades) para paralelizar la compilación.
SCU también permite que un compilador optimizador realice la optimización entre procedimientos sin requerir optimización del tiempo de enlace , lo que permite optimizaciones como la inserción y ayuda a evitar el exceso de código implícito debido a excepciones , efectos secundarios y asignación de registros . Estas optimizaciones a menudo no son posibles en muchos compiladores, debido a la compilación independiente, donde la optimización ocurre por separado en cada unidad de traducción durante la compilación, pero el "enlazador tonto" simplemente vincula los archivos de objeto, sin realizar ninguna optimización por sí mismo, y por lo tanto, la optimización interprocedimiento entre las unidades de traducción. no es posible.
Ejemplo
Por ejemplo, si tiene los archivos fuente foo.cpp y bar.cpp , se pueden colocar en una unidad de compilación única de la siguiente manera:
#include "foo.cpp"#include "bar.cpp"
Suponer foo.cpp y bar.cpp son:
//foo.cpp #include // Un encabezado estándar grande#include "bar.h" // Declaración de función 'bar'int main () // Definición de la función 'main' { bar (); }
//bar.cpp #include // El mismo encabezado estándar grandevoid bar () // Definición de la función 'bar' { ... }
Ahora, el archivo de encabezado estándar ( iostream
) se compila solo una vez, y la función bar
puede integrarse en la función main
, a pesar de ser de otro módulo.