Si el mismo archivo de encabezado se incluye en varios archivos de código fuente en un programa de c++, entonces, ¿cómo es el efecto de la compilación ( Especialmente g++ ) ?

Será el compilador de cargar el archivo de encabezado de una sola vez y compilarlo para cada archivo de código fuente que incluye el encabezado o el archivo de encabezado se cargarán por separado para cada archivo de código fuente que lo incluye .

  • Cómo encabezado de los archivos se cargan es, AFAIK, no se especifica en la compilación de C++ modelo. La aplicación puede elegir a la carga una vez, cárguelo en la demanda (para todos los archivos de código fuente), o carga alguna extraña manera inimaginable por mi finito cerebro.
  • básicamente #include *.h significa «sustituto» todo el texto de *.h archivo aquí
  • Conceptualmente cada uno de los archivos de compilación se presenta una nueva mirada en el encabezado. En realidad, hay una muy buena probabilidad de que su compilador soporta algún tipo de pre-compilado de los encabezados, por lo que se compila el código fuente de alguna forma intermedia, a continuación, los usos que cuando se compila otros archivos que tienen el mismo encabezado.
  • Existe una posibilidad de que el compilador g++ está optimizado para cargar un archivo de encabezado sólo una vez, incluso después de múltiples llamadas de diferentes archivos de origen ?Por favor confirmar.
  • bora: depende de cómo Se llame g++. Si se llama al compilador cada vez que compilar un archivo fuente de C++, no puede hacer algunas de almacenamiento en caché de una instancia a otra (desde un nuevo proceso es generado cada vez que se compila en un archivo). Sin embargo, el sistema operativo será probable almacenar en caché el archivo en sí…
  • es absolutamente podía. Encabezados precompilados son una cosa común y no tienen que ser almacenados en la memoria en un solo proceso. Fácilmente se puede escribir en el disco y utilizado más tarde por los procesos posteriores.

InformationsquelleAutor Biraj Bora | 2013-05-31

3 Comentarios

  1. 4

    La mayoría de los archivos de encabezado tienen especial protección contra múltiples incluye como

    #ifndef MY_HEADER_H
    #define MY_HEADER_H
    
    //header body...
    
    #endif MY_HEADER_H

    Sin esta protección, la cabecera puede ser incluido más de una vez, y esto puede causar la compilación o la vinculación de los errores.

    Compilador puede ser lo suficientemente inteligente como para evitar la lectura de un archivo más de una vez. Pero, incluso si no lo hizo, los sistemas operativos son muy buenos en la caché de los archivos que fueron leído recientemente, y este se carga muy, muy rápidamente, casi sin costo.

    • Si usted lee la pregunta, es sobre la inclusión de la cabecera a través de múltiples archivos de código FUENTE. No incluye múltiples en un solo archivo de origen. Estoy bastante seguro de que no responde a la pregunta como le hacen, pero en lugar de una pregunta similar, con una forma totalmente diferente la respuesta.
    • sí, recompilación es bastante rápido en comparación a la primera compilación de los códigos.
  2. 4

    Hablando con g++: #includes son realizados por el pre-procesador, y no el propio compilador. Usted puede ver el resultado de pre-procesamiento mediante el uso de g++’s -E interruptor. (Edit: El pre-procesador usado para ser independientes, pero ahora es parte del compilador ejecutable, sin embargo, el pre-procesamiento de fase es aún una fase distinta del proceso de compilación para los fines de responder a esta pregunta).

    Con gcc, clang, la corte y el msvc, cada archivo va a ser visitado, cada vez que se encuentran, incluso dentro del mismo archivo de origen.

    El único caso en que esto no es cierto es que si el encabezado del archivo contiene un #pragma once declaración. Algunos compiladores tienen una similar de optimización para el usuario de incluir-guardias:

    #ifndef THIS_FILE_H
    #define THIS_FILE_H 1
    /* the stuff in thisfile.h */
    #endif

    Existe una técnica llamada «encabezados precompilados» apoyado por msvc y gcc (y, probablemente, clang) que trabajará con usted para evitar la compilación de la cabeza de un uso común conjunto de encabezados.

    Normalmente, se realiza por tener una .h o .archivo cpp con todos sus #includes en; a continuación, se #include este archivo primero de cada archivo (o el uso de la idea de un «forzado incluir’: /Fi gratuita en msvc, incluyen con gcc). Cada archivo que utiliza un determinado pch tiene que tener la misma define y opciones del compilador.

    Si se va a escribir la siguiente .h archivo

    //bah.h
    "bah",

    y el siguiente .archivo cpp

    #include <stdio.h>
    
    const char* words[] = {
        "hello",
    #include "bah.h"
        "world",
    #include "bah.h"
    #include "bah.h"
        NULL
    };
    
    int main(int argc, const char* argv[])
    {
        for (size_t i = 0; words[i] != NULL; ++i ) {
            printf("%s\n", words[i]);
        }
        return 0;
    }

    La salida sería

    hola 
    bah 
    mundo 
    bah 
    bah 
    
    • No es exactamente cierto que «para g++: #include-s son realizados por el pre-procesador»: desde hace muchos años, g++ está empezando cc1plus, que es un único programa haciendo pre-procesamiento, análisis, optimizaciones, código de emisiones…. El pre-procesamiento es realizado por el compilador (cc1plus), no por separado. (Se trata de un proceso independiente en el GCC en la década de 1990).
    • Hasta donde yo sabía, el preprocesador era todavía un discreto paso completado en su totalidad antes de comenzar la fase de compilación?
    • Esto era cierto hace mucho tiempo… Y es malo hoy. cc1plus(de GCC 4.x) es la vinculación de un interno de la biblioteca libcpp que hace el preprocesamiento y algunos encadenamiento. Y preprocesamiento sucede durante (justo antes del análisis) de forma incremental…. GCC no funciona por el preprocesamiento de una sola vez, y después de analizar los procesados forma (incluso si parece que funciona de esta manera).
  3. 1

    La pre-procesador se simplemente reemplazar la definición de macro en cada archivo de código fuente, y después de que se ha hecho, la compilador va a empezar a compilar todos los archivos de código fuente para independientes montaje de archivos, que luego será traducido a binario código máquina por Ensamblador. Y el enlazador en el último enlace de todos los archivos objeto a una sola ejecutado archivo o un objeto compartido.

    Así que básicamente no de la empresa de un compilador en un pre-procesamiento de progreso. Y g++ es un paquete de herramientas incluye pre-procesador, compilador, enlazador.

    • Si el compilador paquete de traducir el mismo archivo de encabezado para cada archivo de código fuente en el código compilado, entonces cual es la optimización de código sucediendo ?
    • En la compilación de paso. No creo que hay mucho trabajo que hacer para el jefe de archivo en la optimización. Después de todo, esas son las declaraciones de las funciones o de las definiciones de clase o de otra información que necesitan un uniforme de expresión. Usted tiene todas sus funciones declaradas en un archivo de cabecera, y el otro cc de archivo para su implementación. Usted no desee implementar sus funciones en un archivo de encabezado, no? Pero cuando eso sucede, creo que va a ser optimizado durante la compilación de paso de forma independiente, pero no estoy seguro.

Dejar respuesta

Please enter your comment!
Please enter your name here