visual studio 8 vs. gcc (warum unterscheidet sich die größe der exe)



  • http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/core.2f.MD.2c_2f.ML.2c_2f.MT.2c_2f.LD.asp schrieb:

    These options select either single-threaded or multithreaded run-time routines, indicate if a multithreaded module is a DLL, and select retail or debug versions of the run-time library.

    Dürfte also nicht das sein, was du meinst. Es ist auch aus technischen Gründen eigentlich schwer möglich, Template-Klassen und -Funktionen in DLLs auszulagern, weil man ja nicht im vornherein weiß, mit welchen Template-Parametern etwas instanziert wird. Man könnte bestenfalls noch die Instanzen dieser Templates, die man für sein Programm benutzt, auslagern, aber damit wäre dann nicht wirklich was gewonnen.



  • Ich habe übrigens auch ohne die Standardeinstellungen zu verändern, beim VC++ ein 6KB Hello-World.



  • strip my_program.exe
    

    Entfernt die Symboltabelle aus dem Programm und macht es deutlich kleiner. Debuggen wird damit allerdings schwierig...



  • Optimizer schrieb:

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/core.2f.MD.2c_2f.ML.2c_2f.MT.2c_2f.LD.asp schrieb:

    These options select either single-threaded or multithreaded run-time routines, indicate if a multithreaded module is a DLL, and select retail or debug versions of the run-time library.

    Dürfte also nicht das sein, was du meinst. Es ist auch aus technischen Gründen eigentlich schwer möglich, Template-Klassen und -Funktionen in DLLs auszulagern, weil man ja nicht im vornherein weiß, mit welchen Template-Parametern etwas instanziert wird. Man könnte bestenfalls noch die Instanzen dieser Templates, die man für sein Programm benutzt, auslagern, aber damit wäre dann nicht wirklich was gewonnen.

    ist mir klar, aber es gibt ja auch noch was anderes ausser templates. das hello-world programm wird bei mir 68 kb groß, und mit dynamischer Laufzeitbibliothek 4 kb. 🙄 🙄 (Visual C++ 7.1)



  • Beim GCC die Optionen -Os -s benutzen und die Binaries werden auf größe Optimiert.



  • kingruedi schrieb:

    Beim GCC die Optionen -Os -s benutzen und die Binaries werden auf größe Optimiert.

    Hatte das bei dir mal was gebracht, außer extrem langsamere Binaries.



  • dynamic linker schrieb:

    ist mir klar, aber es gibt ja auch noch was anderes ausser templates. das hello-world programm wird bei mir 68 kb groß, und mit dynamischer Laufzeitbibliothek 4 kb. 🙄 🙄 (Visual C++ 7.1)

    Was auch immer die "Laufzeitbibliothek" ist. Da können auch ne Menge betriebssystemspezifischer Sachen drin stecken. Die Standardbibliothek von C++ besteht zu sehr großen Teilen aus Templates und ich kann dir mal garantieren, dass sie nicht allgemein für mehrere Applikationen ausgelagert werden können. Du kannst natürlich die Instanzen speziell für dein Programm auslagern, hast aber nichts davon, weil du dann die DLL mitliefern musst.
    Wenn du weißt, wie man kleine Binaries erzeugt, halte ich dich nicht auf. Ich mach nichts und habe auch kleine. 🙂
    (VC++ 8, wo ich deine Optionen übrigens gar nicht gefunden habe)



  • ccux schrieb:

    egal wie ich codeblock oder devcpp bzw. unter linux einstelle, die dateien sind alle größer als 400kb(und das bei einem konsolenprog!). der visual compiler erzeugt dateien, die nur 7-50 kb groß sind. was mach ich verkehrt?

    der mingw hat eine zeitlang mal die iostream-lib grundsätzlich statisch gelinkt - ich weiß bloß nicht mehr warum.

    mfg



  • ein programm mit iostream, string, map ist bei mir 22k. da ist auch noch socket, etc drin.
    liegt also nicht an gcc.



  • Besser wäre es mal, wenn ihr die Compiler-Optionen nennt...



  • auf größe optimieren bringt nur ca 10kb, bleiben noch 400. und das bei helloworld, oder 3 klassen-progs? da scheint mir der vc wesentlich besser!



  • -Os -s ist schon die richtige Idee, aber zusätzlich kann auch der Linker optimieren.

    Ähnlich dem Compiler kann man auch dem Linker z.B. -O2 als Paramter übergeben, das macht insbesondere STL deutlich kleiner. Siehe man ld für eine komplette Beschreibung.



  • Das ist ein tolles Rätzelraten.

    Zeig mal den Source und gib die Parameter mit an, dann vergleichen wir. SO hat das überhaupt keinen Sinn! 👎



  • strip wäre auch eine gute Idee.



  • Ringding schrieb:

    strip wäre auch eine gute Idee.

    schwein 😡



  • Hallo,

    im C++ Forum hatten wir doch vor einem Monat oder so n ähnliches Thema, damals haben wir die g++ binaries auf die gleiche Größe wie die executables vom VC8 bekommen. Sucht halt mal danach.

    Ponto schrieb:

    kingruedi schrieb:

    Beim GCC die Optionen -Os -s benutzen und die Binaries werden auf größe Optimiert.

    Hatte das bei dir mal was gebracht, außer extrem langsamere Binaries.

    Also ich konnte bisher keinen wirklichen Performance-Verlust bemerken, aber die Binaries wurden wirklich kleiner

    Mfg

    GPC



  • Ringding schrieb:

    strip wäre auch eine gute Idee.

    Oh, hat schon jemand geschrieben (Steven). Sorry, hab's übersehen.



  • Hallo Leutz. Ich hab das auch mal ausprobiert und ich komme auf 5.6 kByte für meine hello.exe unter Windows.

    hello.c

    #include <stdio.h>
    
    int main(){
      printf("Hello World");
      return 0;
    }
    

    Kompiliert habe ich in der Konsole mit dem GCC 3.4.2 von MinGW und danach die Exe nochmals mit strip bearbeitet.

    >gcc -o hello.exe hello.c
    >strip hello.exe
    


  • Optimizer schrieb:

    Es ist auch aus technischen Gründen eigentlich schwer möglich, Template-Klassen und -Funktionen in DLLs auszulagern, weil man ja nicht im vornherein weiß, mit welchen Template-Parametern etwas instanziert wird. Man könnte bestenfalls noch die Instanzen dieser Templates, die man für sein Programm benutzt, auslagern, aber damit wäre dann nicht wirklich was gewonnen.

    Man könnte ohne weiteres cout, cin, fstream, stringstream in eine dynamische Bibliothek packen da sie die einzigen gebräuchlichen Instancen sind dieser Templates sind. Für den äußerst unwahrscheinlichen Fall, dass mal jemand eine andere Instance benutzt (mal abgesehen von den wide Versionen) kannst du die ja immer noch statisch linken. Das gleiche gilt für std::string.


Anmelden zum Antworten