windows - Compilerede C + + -kørsler HUGE?

Indlæg af Hanne Mølgaard Plasc

Problem



Efter programmering i et stykke tid i C besluttede jeg endelig at begynde at lære C ++. Dette forstyrrer mig, som standard 'hej verden' i C er som regel ~ 16KB, inklusive alt det råmateriale, som din kompilator kaster der. (Brug af stdio)


Men når jeg opretter en C + + eksekverbar gør hej verden, er filen ~ 470KB! Jeg gik videre og brugte cstdio i stedet for iostream, tænkte det ville gøre en forskel, og det gjorde det.


Mit spørgsmål er:
Når jeg inkludere iostream, hvorfor eksploderer størrelsen af ​​min eksekverbare?


Rediger: Jeg bruger G ++ (Med Dev-CPP IDE, men jeg kan finde ud af, hvordan man tilføjer CL parametre)

Bedste reference


I et ord symboler .


C ++ standardbiblioteket introducerer et parti af symboler til dit program, da det meste af biblioteket findes primært i headerfilerne.


Genkompil dit program i frigivelsestilstand og uden fejlfindingssymboler, og du kan nemt forvente, at programmet bliver væsentligt mindre. (Mindre stadig hvis du stripper symboler.)


Som en hurtig demonstration af denne kendsgerning skal man observere:


$ cat hello.c
#include <stdio.h>
int main() {
    printf("\%s
", "Hello, world!");
    return 0;
}
$ cat hello.cpp
#include <iostream>
int main() {
    std::cout << "Hello, world!
";
    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*


Jeg kan ikke forklare, hvorfor en Windows-opbygning af programmerne med G ++ producerer så store eksekverbare filer, men på en hvilken som helst anden platform er symboler den primære kørefaktor i store filstørrelser. Jeg har ikke adgang til et Windows-system i øjeblikket, så jeg kan ikke teste.

Andre referencer 1


Bliver du slået ind i det meste af standardbiblioteket ved hjælp af iostreams.
Det er en engangs ting, selvom dine programmer bliver større, vil det virke mindre og mindre af en overhead.


Men du vil sandsynligvis kompilere ved hjælp af en fælles biblioteksversion af standardbiblioteket, og de fleste compilers/operativsystemer giver dig mulighed for at gøre dette, så du ikke behøver at inkludere alt standardbiblioteket i din eksekverbare. Hvilken compiler bruger du og vi kan sandsynligvis rådgive om, hvordan man gør det.


På Windows med VC kommandolinje, brug f.eks./MD kommandolinjen.

Andre referencer 2


Jeg vil gætte, at du ved indbefatning <iostream> indirekte omfatter mange dele af STL, som <string>, som igen indeholder <vector> osv.

Andre referencer 3


Dette er mere en artefakt af kompilatoren (og muligheder) du bruger end næsten alt andet. Med MS VC ++, afhængigt af compiler flagene, jeg bruger, kan jeg komme overalt fra ~ 8K til ~ 110K. Ved hjælp af MinGW kommer jeg rundt 24-25K (igen afhængigt af flag).


Bare hvis du undrer mig, tror jeg, at det større udvalg, jeg får med VC ++, er for det meste et resultat af at kende sine flag bedre. MinGW kan kun dække et mindre interval, selvom jeg vidste det bedre, men på grund af mit begrænsede kendskab til flagene accepterer jeg det meste af det, det gør som standard, jeg ved, hvordan man aktiverer optimering og off, men skal se på tingene temmelig omhyggeligt for at gøre meget mere end det.

Andre referencer 4


MinGW (g ++) kompilerer virkelig store filer.

For eksempel samler det samme 'hello world' -program med iostreams til ~ 100KB af VC ++ (med statisk koblet CRT) og til ~ 470KB ved g ++.

Andre referencer 5


Dette er et aspekt af det falske C ++-interview, der faktisk er sant:) [5]



  Du ved, da vi havde vores første C ++-compiler, hos AT &T, udarbejdede jeg 'Hello World' og kunne ikke tro på størrelsen af ​​den eksekverbare. 2.1MB

  
  Hvad? Nå har kompilatorer kommet langt, siden da.

  
  De har? Prøv det på den nyeste version af g ++ - du vil ikke få meget forandring ud af en halv megabyte.