2010-11-14 5 views
5

Après avoir programmé pendant un moment en C, j'ai décidé de finalement commencer à apprendre le C++. C'est un peu ennuyeux pour moi, car le 'hello world' standard en C est habituellement ~ 16KB, y compris tout le crud que votre compilateur jette là-bas. (En utilisant stdio)Exécutions C++ compilées ÉNORME?

Cependant, quand je crée un exécutable C++ en faisant hello world, le fichier est ~ 470KB! Je suis allé de l'avant et utilisé cstdio au lieu de iostream, pensant que cela ferait une différence et il l'a fait.

Ma question est: Quand j'inclus iostream, pourquoi la taille de mon exécutable explose-t-elle?

Edit: J'utilise G ++ (avec l'IDE Dev-RPC, mais je peux comprendre comment ajouter CL paramaters)

+0

Je tiens à souligner que Dev-C++ est livré avec une version * très * ancienne de GCC. Pensez à passer à wxDev-C++ ou Code :: Blocks, qui sont tous deux beaucoup plus à jour. – greyfade

Répondre

6

En un mot, symboles.

La bibliothèque standard C++ introduit un lot de symboles dans votre programme, car la plupart de la bibliothèque existe principalement dans les fichiers d'en-tête.

Recompilez votre programme en mode édition et sans symboles de débogage, et vous pouvez facilement vous attendre à ce que le programme soit significativement plus petit. (. Plus petit encore si vous dépouillez symboles)

Comme une démonstration rapide de ce fait, observez:

$ 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* 

Je ne peux pas expliquer pourquoi une version de Windows des programmes avec G ++ produit ces grandes executables, mais Sur toute autre plate-forme, les symboles sont le principal facteur déterminant dans les fichiers volumineux. Je n'ai pas accès à un système Windows pour le moment, donc je ne peux pas tester.

+1

+1! Vous pouvez trouver un ** lot ** de symboles de débogage dans STL. – jwueller

+0

Salut, merci d'avoir pris le temps de faire les résultats. Je l'ai fait dans Windows en utilisant les drapeaux '-s -O3', et la taille du fichier réduit de 475kb à 263kb. Ça aide, mais est-ce que je peux faire plus? – Saustin

+1

@Saustin: Utiliser un compilateur plus récent. Vous en utilisez un qui est * très * vieux. Il vient probablement avec un peu de cruft qui n'est pas globbed sur les versions plus récentes. De toute façon, Dev-C++ n'est pas maintenu, donc il n'y a pas de raison de continuer à l'utiliser quand il y a tant d'autres choix, meilleurs. Je veux dire, la version la plus récente était en 2005! – greyfade

7

Becuase que vous avez traîné dans la plupart de la bibliothèque standard en utilisant iostreams. C'est une chose unique alors si vos programmes prennent de l'ampleur, il semblera de moins en moins lourd.

Cependant, vous voudrez probablement compiler en utilisant une version de bibliothèque partagée de la bibliothèque standard et la plupart des compilateurs/systèmes d'exploitation vous permettront de faire cela afin de ne pas inclure toute la bibliothèque standard dans votre exécutable. Quel compilateur utilisez-vous et nous pouvons probablement vous conseiller sur la façon de le faire.

Sur les fenêtres avec une ligne de commande VC, utilisez par exemple l'option de ligne de commande/MD.

+0

J'utilise G ++ w \ Dev-CPP. – Saustin

2

Je suppose que, en incluant <iostream> vous incluez indirectement de nombreuses parties de la STL, comme <string> qui comprend à son tour <vector> etc.

+0

Pour mettre cette réponse en C-terms, c'est la différence entre l'utilisation de putc et printf. Le code de printf a BEAUCOUP de fonctionnalité qui (relativement) emballe votre exécutable C par rapport à une simple fonction putc. Pour la situation de Saustin, les méthodes sont «énormes» par rapport à printf, et STL est «énorme» par rapport à . – franji1

2

Ceci est plus un artefact du compilateur (et des options) que vous utilisez que presque toute autre chose. Avec MS VC++, selon les drapeaux du compilateur que j'utilise, je peux aller de ~ 8K à ~ 110K. En utilisant MinGW, j'obtiens autour de 24-25K (encore, selon les drapeaux). Juste au cas où vous vous le demanderiez, je suppose que la plus grande portée que je reçois avec VC++ est principalement un résultat de mieux connaître ses drapeaux. MinGW pourrait couvrir seulement couvrir une plus petite gamme même si je le savais mieux, mais en raison de ma connaissance limitée de ses drapeaux, j'accepte la plupart de ce qu'il fait par défaut; Je sais comment activer et désactiver l'optimisation, mais je dois regarder les choses assez attentivement pour faire beaucoup plus que cela.

1

MinGW (g ++) compile de très gros fichiers.
Par exemple, le même programme "hello world" avec iostreams est compilé à ~ 100 Ko par VC++ (avec CRT lié statiquement) et à ~ 470 Ko par g ++.

+0

Cela est toujours vrai avec le nouveau Visual Studio et MinGW w-64 avec GCC 7.2.0 (avec les indicateurs de compilateur standard que CMake utilise pour les versions Release). – clocktown

1

C'est un aspect de la qui est en fait un peu de vrai :)

Vous savez, quand nous avons eu notre premier compilateur C++, à AT & T, je compilé « Bonjour tout le monde », et couldn Je ne crois pas à la taille de l'exécutable. 2.1MB

Quoi? Eh bien, les compilateurs ont parcouru un long chemin, depuis lors.

Ils ont? Essayez-le sur la dernière version de g ++ - vous n'obtiendrez pas beaucoup de changements sur un demi-mégaoctet.

+1

Pas vraiment utile, mais un peu d'humour aide. – Saustin

Questions connexes