Pike escribió un poco más sobre ella en https://talks.golang.org/2012/splash.article:
En 1984, una compilación de ps.c
, la fuente hasta el comando ps Unix, se observó a #include <sys/stat.h>
37 veces por el tiempo todo el preprocesamiento tenía ha hecho. Aunque los contenidos se descartan 36 veces, la mayoría de las implementaciones C abrirán el archivo, leerán y lo analizarán 37 veces. Sin gran astucia, de hecho, ese comportamiento es requerido por la macro semántica potencialmente compleja del preprocesador C .
Los compiladores se han vuelto bastante inteligentes desde: https://gcc.gnu.org/onlinedocs/cppinternals/Guard-Macros.html, por lo que esto no es un problema ahora.
La construcción de un solo binario en C++ en Google puede abrir y leer cientos de archivos de encabezado individuales decenas de miles de veces. En 2007, los ingenieros de construcción en Google instrumentaron la compilación de un gran binario de Google . El archivo contenía aproximadamente dos mil archivos que, si simplemente se concatenan juntos, sumaban 4,2 megabytes. Para el momento los #includes se habían expandido, se habían entregado más de 8 gigabytes a la entrada del compilador, una ampliación de 2000 bytes para cada byte fuente C++ .
Como otro punto de datos, en 2003 el sistema de compilación de Google se movió de un único Makefile a un diseño por directorio con dependencias explícitas mejor administradas, más . Un binario típico se redujo aproximadamente un 40% en tamaño de archivo, solo por tener grabadas dependencias más precisas. Aun así, las propiedades de C++ (o C para el caso) hacen que sea impráctico verificar esas dependencias automáticamente, y hoy todavía no tenemos una comprensión precisa de los requisitos de dependencia de los grandes binarios de Google C++ .
El punto acerca de los tamaños binarios sigue siendo relevante. Los compiladores (vinculadores) son bastante conservadores con respecto a la eliminación de símbolos no utilizados. How to remove unused C/C++ symbols with GCC and ld?
En Plan 9, los archivos de cabecera se les prohibió que contiene además #include
cláusulas; todos los #includes
estaban obligados a estar en el archivo C de nivel superior. Esto requirió cierta disciplina, por supuesto, el programador era requerido para enumerar las dependencias necesarias exactamente una vez, en el orden correcto , pero la documentación ayudó y en la práctica funcionó muy bien .
Esta es una posible solución.Otra posibilidad es tener una herramienta que administre los incluye para usted, por ejemplo MakeDeps.
También hay compilaciones unitarias, a veces denominadas unidades de compilación única (SCU). Hay herramientas para ayudar a administrar eso, como https://github.com/sakra/cotire
Usar un sistema de compilación que optimice la velocidad de compilación incremental también puede ser una ventaja. Estoy hablando de Bazel de Google y similares. Sin embargo, no lo protege de un cambio en un archivo de encabezado que se incluye en una gran cantidad de otros archivos.
Por último, hay una propuesta para los módulos de C++ en las obras, gran cosa https://groups.google.com/a/isocpp.org/forum/#!forum/modules. Consulte también What exactly are C++ modules?
Encuentro esta respuesta muy útil. Lo curioso es que estoy de acuerdo de una manera más irónica: si la computadora puede hacer mi trabajo, ¿por qué lo haré? ;) –