2010-11-14 11 views
5

Después de programar por un tiempo en C, decidí finalmente comenzar a aprender C++. Esto me molesta un poco, ya que el "mundo hola" estándar en C suele ser ~ 16KB, incluyendo todo el crud que tu compilador arroja allí. (Usando stdio)¿Ejecutables compilados de C++ ENORMES?

Sin embargo, cuando creo un ejecutable en C++ haciendo hello world, ¡el archivo es ~ 470KB! Seguí adelante y usé cstdio en lugar de iostream, pensando que marcaría la diferencia y lo hizo.

Mi pregunta es: Cuando incluyo iostream, ¿por qué explota el tamaño de mi ejecutable?

Editar: Estoy usando G ++ (Con el IDE Dev-CPP, pero no puedo encontrar la manera de añadir Paramaters CL)

+0

Me gustaría señalar que Dev-C++ viene con una * muy * versión anterior de GCC. Considere moverse a wxDev-C++ o Code :: Blocks, los cuales están mucho más actualizados. – greyfade

Respuesta

6

En una palabra, símbolos .

La biblioteca estándar de C++ introduce un lote de símbolos en su programa, ya que la mayoría de la biblioteca existe principalmente en los archivos de encabezado.

Recompile su programa en modo de lanzamiento y sin símbolos de depuración, y puede esperar fácilmente que el programa sea significativamente más pequeño. (. Más pequeño aún si se tira de símbolos)

Como una rápida demostración de este hecho, observa:

$ cat hello.c 
#include <stdio.h> 
int main() { 
    printf("%s\n", "Hello, world!"); 
    return 0; 
} 
$ cat hello.cpp 
#include <iostream> 
int main() { 
    std::cout << "Hello, world!\n"; 
    return 0; 
} 
$ gcc hello.c -o hello-c 
$ g++ hello.cpp -o hello-cpp 
$ gcc hello.c -ggdb -o hello-c-debug 
$ g++ hello.cpp -ggdb -o hello-cpp-debug 
$ gcc hello.c -s -o hello-c-stripped 
$ g++ hello.cpp -s -o hello-cpp-stripped 
$ gcc hello.c -s -O3 -o hello-c-stripped-opt 
$ g++ hello.cpp -s -O3 -o hello-cpp-stripped-opt 
$ ls -gG hello* 
-rwxr-xr-x 1 6483 Nov 14 15:39 hello-c* 
-rw-r--r-- 1 79 Nov 14 15:38 hello.c 
-rwxr-xr-x 1 7859 Nov 14 15:40 hello-c-debug* 
-rwxr-xr-x 1 7690 Nov 14 15:39 hello-cpp* 
-rw-r--r-- 1 79 Nov 14 15:38 hello.cpp 
-rwxr-xr-x 1 19730 Nov 14 15:40 hello-cpp-debug* 
-rwxr-xr-x 1 5000 Nov 14 15:45 hello-cpp-stripped* 
-rwxr-xr-x 1 4960 Nov 14 15:41 hello-cpp-stripped-opt* 
-rwxr-xr-x 1 4216 Nov 14 15:45 hello-c-stripped* 
-rwxr-xr-x 1 4224 Nov 14 15:41 hello-c-stripped-opt* 

No puedo explicar por qué una compilación de Windows de los programas con G ++ produce tan grandes ejecutables, pero en cualquier otra plataforma, los símbolos son el principal factor de manejo en archivos de gran tamaño. No tengo acceso a un sistema de Windows en este momento, así que no puedo probar.

+1

+1! Puede encontrar un ** lote ** de símbolos de depuración en STL. – jwueller

+0

Hola, gracias por tomarte el tiempo de hacer los resultados. Hice esto en Windows usando las banderas '-s -O3' y el tamaño del archivo reducido de 475kb a 263kb. Ayuda, pero ¿hay algo más que pueda hacer? – Saustin

+1

@Saustin: utilice un compilador más nuevo. Estás usando uno que es * muy * viejo. Probablemente viene con algún fragmento que no se engloba en las versiones más nuevas. Dev-C++ no se mantiene de todos modos, por lo que no hay razón para seguir usándolo cuando hay tantas otras opciones mejores. Quiero decir, ¡la versión más reciente fue en 2005! – greyfade

7

Becuase significa que ha arrastrado en la mayor parte de la biblioteca estándar utilizando iostreams. Sin embargo, es algo único, por lo que a medida que sus programas crezcan, parecerá que cada vez son menos.

Sin embargo, probablemente desee compilar usando una versión de biblioteca compartida de la biblioteca estándar y la mayoría de los compiladores/sistemas operativos le permitirán hacerlo, así no tendrá que incluir toda la biblioteca estándar en su ejecutable. ¿Qué compilador estás usando y podemos aconsejarte cómo hacerlo?

En Windows con línea de comandos de VC, use la opción de línea de comandos/MD por ejemplo.

+0

Estoy usando G ++ w \ Dev-CPP. – Saustin

2

yo supongo que al incluir <iostream> que estés incluyendo indirectamente a muchas partes del STL, como <string> que a su vez incluye <vector> etc.

+0

Para poner esta respuesta en C-terms, es la diferencia entre usar putc vs. printf. El código printf tiene MUCHA funcionalidades que (relativamente) embarca tu ejecutable C contra una simple función putc. Para la situación de Saustin, los métodos son "enormes" en relación con printf, y STL es "enorme" en relación con . – franji1

2

Esto es más un artefacto del compilador (y opciones) que utiliza que casi cualquier otra cosa. Con MS VC++, dependiendo de los indicadores del compilador que uso puedo llegar a cualquier lugar desde ~ 8K a ~ 110K. Usando MinGW, obtengo alrededor de 24-25K (de nuevo, dependiendo de las banderas).

En caso de que se lo pregunte, supongo que el rango más grande que obtengo con VC++ es en su mayoría como resultado de conocer mejor sus banderas. MinGW podría solo cubrir un rango más pequeño, incluso si lo conocía mejor, pero debido a mi conocimiento limitado de sus indicadores, estoy aceptando la mayoría de lo que hace por defecto; Sé cómo activar y desactivar la optimización, pero tengo que mirar las cosas con mucho cuidado para hacer mucho más que eso.

1

MinGW (g ++) compila archivos realmente grandes.
Por ejemplo, el mismo programa "hello world" con iostreams compila a ~ 100KB por VC++ (con CRT estáticamente enlazado) y a ~ 470KB por g ++.

+0

Esto sigue siendo cierto con el más nuevo Visual Studio y MinGW w-64 con GCC 7.2.0 (con los indicadores de compilación estándar que CMake usa para las compilaciones de Release). – clocktown

1

Este es un aspecto de la que es realmente bueno de verdad :)

Usted sabe, cuando tuvimos nuestro primer compilador de C++, en el AT & T, I compilado 'Hello World', y couldn No creo el tamaño del ejecutable. 2.1MB

¿Qué? Bueno, los compiladores han recorrido un largo camino desde entonces.

Ellos tienen? Pruébelo en la última versión de g ++: no obtendrá muchos cambios de medio megabyte.

+1

No es realmente útil, pero un poco de humor ayuda. – Saustin

Cuestiones relacionadas