compiler c++ c++11 compilation code-organization

compiler - c++11 download



¿Son innecesarios incluir archivos una sobrecarga? (4)

Además de los tiempos de compilación obviamente más largos, puede haber otros problemas. El IMHO más importante son las dependencias a bibliotecas externas. No quieres que tu programa dependa de más bibliotecas de las necesarias.

También necesita instalar esas bibliotecas en cada sistema en el que desee que el programa se base. Esto puede convertirse en una pesadilla, especialmente cuando el siguiente programador necesita instalar alguna biblioteca cliente de base de datos, aunque el programa nunca usa una base de datos.

Además, especialmente los encabezados de bibliotecas a menudo tienden a definir macros. A veces, esas macros tienen nombres muy genéricos que romperán su código o que son incompatibles con otros encabezados de biblioteca que podría necesitar.

He visto un par de preguntas sobre cómo detectar archivos #include innecesarios en un proyecto C ++. Esta pregunta me ha intrigado a menudo, pero nunca he encontrado una respuesta satisfactoria.

Si hay algunos archivos de encabezado incluidos, que no se están utilizando en un proyecto de c ++, ¿se trata de una sobrecarga? Entiendo que significa que antes de la compilación, los contenidos de todos los archivos de encabezado se copiarían en los archivos de origen incluidos y eso daría lugar a una gran cantidad de compilaciones innecesarias.

¿Hasta qué punto se extiende este tipo de sobrecarga a los archivos de objeto compilados y los binarios?

¿Los compiladores no pueden hacer algunas optimizaciones para asegurarse de que este tipo de sobrecarga no se transfiera a los archivos objeto y binarios resultantes?

Teniendo en cuenta el hecho de que probablemente no sepa nada sobre la optimización del compilador, todavía quiero preguntar esto, en caso de que haya una respuesta.

Como programador que utiliza una amplia variedad de bibliotecas de c ++ para su trabajo, ¿qué tipo de prácticas de programación debo seguir para evitar tales gastos generales? ¿Me estoy familiarizando íntimamente con el funcionamiento de cada biblioteca?


La respuesta simple es SÍ, es una sobrecarga en lo que respecta a la compilación, pero para el tiempo de ejecución simplemente creará cualquier diferencia. La razón es que digamos que agrega #include <iostream> ( solo por ejemplo ) y asumimos que no está usando ninguna de sus funciones, entonces g ++ 4.5.2 tiene otras 18,560 líneas de código adicionales para procesar ( compilación ). Pero en lo que respecta a la sobrecarga del tiempo de ejecución, casi no creo que cree un problema de rendimiento.

También puede consultar ¿Las inusitadas incluyen dañinas en C / C ++? donde realmente me gustó este punto hecho por David Young

Cualquier singleton declarado como externo en un encabezado y definido en un archivo fuente se incluirá en su programa. Obviamente, esto aumenta el uso de la memoria y posiblemente contribuye a una sobrecarga de rendimiento al hacer que uno acceda a su archivo de página con mayor frecuencia (no es un gran problema ahora, ya que los singletons suelen ser de tamaño pequeño a mediano y porque la mayoría de las personas que conozco tienen 6+ GB de RAM).


No afecta el rendimiento del binario o incluso el contenido del archivo binario, para casi todos los encabezados. Las declaraciones no generan ningún código, las definiciones de espacio de nombres en línea / estáticas / anónimas se optimizan si no se usan, y ningún encabezado debe incluir definiciones visibles externamente (que se rompen si el encabezado está incluido por más de una unidad de traducción).

Como señala @TC, la excepción son los objetos estáticos visibles internamente con constructores no triviales. iostream hace esto, por ejemplo. El programa debe comportarse como si se llamara al constructor, y el compilador generalmente no tiene suficiente información para optimizar el constructor.

Sin embargo, sí afecta la duración de la compilación y la cantidad de archivos que se volverán a compilar cuando se cambie un encabezado. Para proyectos grandes, esto es suficiente incentivo para preocuparse por los gastos innecesarios.


Por supuesto, cualquier #include es una sobrecarga. El compilador necesita analizar ese archivo.

Así que evítalos. Utilice declaraciones hacia adelante siempre que sea posible.

Se acelerará la compilación. Ver el libro de Scott Myers sobre el tema.