Aufgeblähte C++ Programme !?



  • Mir ist gerade aufgefallen dass eine einfache "Hello World" Anwendung, wenn ich sie als standard C Programm Kompiliere, ca 30kB gross ist, jedoch wenn ich sie als C++ Kompiliere fast 500kB gross ist! 😮 Ist das eine Eigenschaft von C++ Programmen? Ich benutze den Dev-C++ mit dem gcc Compiler. Weiss jemand was?

    Gruss

    Stefan



  • Stöffel schrieb:

    Mir ist gerade aufgefallen dass eine einfache "Hello World" Anwendung, wenn ich sie als standard C Programm Kompiliere, ca 30kB gross ist, jedoch wenn ich sie als C++ Kompiliere fast 500kB gross ist! 😮 Ist das eine Eigenschaft von C++ Programmen? Ich benutze den Dev-C++ mit dem gcc Compiler. Weiss jemand was?

    Das ist nicht unbedingt ein C++ Problem, sondern eins der Standardbibliothek. Sobald du nämlich den iostream Header dazulinkst, blähst du die binary sehr auf. Und evtl. hast du auch noch -static bei den Compileroptionen angegeben. Dann wird die binary nämlich noch mal größer (zwar auch flexibler, weil sie keine Libs mehr braucht, aber halt auch größer).

    MfG

    GPC



  • hi,
    normalerweise landen in der exe nur die sachen, die auch wirklich benutzt werden. diesen zuwachs von 470kb!! finde ich extrem gross. vielleicht haste auch die ganzen debug-infos mit drin?



  • Naja, ein guter Compiler kann aber trotz iostream das ganze auf 9 kbyte runter brechen. Ich bin der Meinung, das MSVC8.0 das kann. Mein MSVC7.1 macht die EXE-Dateien im DEBUG jedenfalls 90 KByte groß. Im Release werden es sicherlich weniger sein.

    Benutzt vernünftige Werkzeuge, habt ihr auch vernünftige Ergebnisse. 😃



  • @GPC Ja, du hast recht, wenn ich <iostream> nicht einbinde, ist das Programm nur noch 15kB gross. Aber wieso kopiert der Compiler die ganze iostream Library in das .exe? Wenn ich "Hello World" ausgebe, benutze ich doch nur einen Bruchteil der Library, nicht? Wenn ich anstatt <iostream> die <cstdio> include, dann wird das Programm kein Bischen grösser, erzielt aber das gleiche Ergebnis. Für mich ergibt das Ganze keinen Sinn. 😕

    @net Debugging ist deaktiviert. Das Programm wird auch aufgebläht wenn ich gar keine Funktion von <iostream> im Programm benutze, alleine das includen machts. Das einschalten der besten Optimierung bringt offenbar auch nichts.



  • Stöffel schrieb:

    @net Debugging ist deaktiviert. Das Programm wird auch aufgebläht wenn ich gar keine Funktion von <iostream> im Programm benutze, alleine das includen machts. Das einschalten der besten Optimierung bringt offenbar auch nichts.

    nimmst du 'nen gcc unter windows? kann mich dunkel dran erinnern, dass der superfette exen erzeugt hat...



  • Stöffel schrieb:

    @GPC Ja, du hast recht, wenn ich <iostream> nicht einbinde, ist das Programm nur noch 15kB gross. Aber wieso kopiert der Compiler die ganze iostream Library in das .exe? Wenn ich "Hello World" ausgebe, benutze ich doch nur einen Bruchteil der Library, nicht?

    Richtig, interessiert den Compiler aber nicht. Der kopiert per #include einfach die komplette iostream + deren Abhängigkeiten (string usw. ) in deine Datei rein.

    Wenn ich anstatt <iostream> die <cstdio> include, dann wird das Programm kein Bischen grösser, erzielt aber das gleiche Ergebnis. Für mich ergibt das Ganze keinen Sinn. 😕

    Na ja, die cstdio ist ja schon deutlich kompakter, die fällt kaum ins Gewicht.

    @net Debugging ist deaktiviert. Das Programm wird auch aufgebläht wenn ich gar keine Funktion von <iostream> im Programm benutze, alleine das includen machts. Das einschalten der besten Optimierung bringt offenbar auch nichts.

    -Os (auf Größe optimieren) und -s (Debugging-Symbole entfernen) verkleinert bis zu einem gewissen Grad.

    Artchi schrieb:

    Naja, ein guter Compiler kann aber trotz iostream das ganze auf 9 kbyte runter brechen. Ich bin der Meinung, das MSVC8.0 das kann. Mein MSVC7.1 macht die EXE-Dateien im DEBUG jedenfalls 90 KByte groß. Im Release werden es sicherlich weniger sein.

    Benutzt vernünftige Werkzeuge, habt ihr auch vernünftige Ergebnisse. 😃

    ja ja, schon recht. MS rulez. Aber wir haben hier im Compiler-Forum schon öfters solche Size-Tests durchgeführt und dabei kam raus, dass sich der aktuelle g++ und der VC++ 8 in diesem Punkt (fast) nichts schenken. Die VC binaries werden auch nur so klein, weil die Std-lib nicht mitgelinkt wird.
    Ich such jetzt mal den Thread...
    gefunden: http://www.c-plusplus.net/forum/viewtopic-var-t-is-153789-and-postdays-is-0-and-postorder-is-asc-and-start-is-10.html



  • #include <tchar.h>
    #include <iostream>
    
    int _tmain()
    {
      std::cout << "Hello world";
    }
    

    Ergibt bei mir (VS2005) im Release:
    7.680 bytes (shared CRT)
    110.592 bytes (static CRT)



  • GPC schrieb:

    Stöffel schrieb:

    @GPC Ja, du hast recht, wenn ich <iostream> nicht einbinde, ist das Programm nur noch 15kB gross. Aber wieso kopiert der Compiler die ganze iostream Library in das .exe? Wenn ich "Hello World" ausgebe, benutze ich doch nur einen Bruchteil der Library, nicht?

    Richtig, interessiert den Compiler aber nicht. Der kopiert per #include einfach die komplette iostream + deren Abhängigkeiten (string usw. ) in deine Datei rein.

    aber was soll das? es ist doch absolut sinnlos, irgendwas in die exe zu packen, was nie verwendet wird 😕



  • net schrieb:

    GPC schrieb:

    Stöffel schrieb:

    @GPC Ja, du hast recht, wenn ich <iostream> nicht einbinde, ist das Programm nur noch 15kB gross. Aber wieso kopiert der Compiler die ganze iostream Library in das .exe? Wenn ich "Hello World" ausgebe, benutze ich doch nur einen Bruchteil der Library, nicht?

    Richtig, interessiert den Compiler aber nicht. Der kopiert per #include einfach die komplette iostream + deren Abhängigkeiten (string usw. ) in deine Datei rein.

    aber was soll das?

    Ich nehme an, es war den Compiler-Entwicklern egal (zumindest denen beim VC und GCC), dass die exe dann halt größer wird. Ich meine hey, 100-500 kb, was ist das schon? Mich hätt's auch nicht gejuckt, wenn ich vor der Entscheidung gestanden hätte.

    es ist doch absolut sinnlos, irgendwas in die exe zu packen, was nie verwendet wird 😕

    Ja, sicher. Aber ich denke dieser Aspekt wird nur in Bereichen relevant, wo es wirklich auf Platz ankommt. Und da wird vermutlich nicht der VC oder die GCC eingesetzt und auch nicht iostream dazugelinkt^^

    @Stöffel
    Welche Version vom MinGW hast du denn? Noch 'ne 3.x? Die 4.0 ist in dem Punkt nämlich deutlich besser (und die Programme sind meist schneller)



  • GPC schrieb:

    @Stöffel
    Welche Version vom MinGW hast du denn? Noch 'ne 3.x? Die 4.0 ist in dem Punkt nämlich deutlich besser (und die Programme sind meist schneller)

    Ja, die Version ist 3.4.2. Aber wieso fragst du nach der Version der MinGW? Ich dachte das sind nur die Library files. Reicht es wenn ich den Compiler ersetzte, oder muss ich die Library auch erneuern?
    Die Optimierungen -Os -s haben übrigens das .exe um ein ganzes kB geschrumpft. WOW! 😃



  • Stöffel schrieb:

    Ja, die Version ist 3.4.2. Aber wieso fragst du nach der Version der MinGW? Ich dachte das sind nur die Library files. Reicht es wenn ich den Compiler ersetzte, oder muss ich die Library auch erneuern?

    du musst einen anderen linker nehmen. normalerweise muss der erkennen was unbenutzt ist und das dann draussen lassen.
    :xmas2:



  • Stöffel schrieb:

    Die Optimierungen -Os -s haben übrigens das .exe um ein ganzes kB geschrumpft. WOW! 😃

    Hm, du hast sicherlich -O2 oder -O3 dringelassen, hm? Mach das mal raus und schau dann, was passiert.
    Bei mir hat -s nämlich immer ziemlich viel gebracht.



  • Ne aktuelle version vom MinGW dürfte auch gut tun, schau mal auf der Homepage http://www.mingw.org



  • Lass mal strip drueberlaufen. Vielleicht bringt es ja noch ein bissle

    gruss
    v R



  • GPC schrieb:

    Stöffel schrieb:

    Die Optimierungen -Os -s haben übrigens das .exe um ein ganzes kB geschrumpft. WOW! 😃

    Hm, du hast sicherlich -O2 oder -O3 dringelassen, hm? Mach das mal raus und schau dann, was passiert.
    Bei mir hat -s nämlich immer ziemlich viel gebracht.

    Jetzt wo ich über ein batch File kompiliert habe, ist das .exe tatsächlich auf 260kB geschrumpft. Vom Dev-C++ aus hatte das irgendwie nicht geklappt. Ich werde dann mal versuchen den Compiler zu erneuern. Danke für die Hilfe.



  • Jetzt habe ich mal ein "Hello World" in VC++ 2005 gemacht. Nur 8kB!? 😮



  • Stöffel schrieb:

    Jetzt habe ich mal ein "Hello World" in VC++ 2005 gemacht. Nur 8kB!? 😮

    Es dürfte klar sein, dass der MS Compiler (da ja für Windows entwickelt) ziemlich viel rauskitzeln kann und außerdem so gut wie nichts statisch dazugelinkt wurde.



  • Wie aus meinem letzten Posting ersichtlich ist, erreicht man die 8 KB (bei verwendung der STL) *nur*, wenn man gegen die DLL-version der CRT linkt!



  • wenns schon auf die letzten Bytes ankommt, bringts der Vergleich von dynamisch-gelinkten Programmen gar nicht.

    Jochen Kalmbach schrieb:

    #include <tchar.h>
    #include <iostream>
    	
    int _tmain()
    {
      std::cout << "Hello world";
    }
    

    Ergibt bei mir (VS2005) im Release:
    7.680 bytes (shared CRT)
    110.592 bytes (static CRT)

    hm, wenn ich mit dem gcc mit -Os -s -static kompiliere, wirds immer noch 9x so groß. Ist bei "static-CRT" wirklich alles drin?

    Aber man müsste das schon präziser vergleichen... C++-hello world != C++ mit exceptions und destruktoren


Log in to reply