2010-11-14 16 views
5

Nachdem ich eine Weile in C programmiert habe, entschied ich mich endlich C++ zu lernen. Das stört mich, da die Standard-Hallo-Welt in C ~ 16KB ist, einschließlich all der Crude, die dein Compiler dort auslöst. (Mit stdio)Kompilierte C++ - ausführbare Dateien RIESIG?

Wenn ich jedoch eine C++ - ausführbare Datei erstellen Hallo Welt, ist die Datei ~ 470KB! Ich ging voran und benutzte cstdio anstelle von iostream und dachte, dass es einen Unterschied machen würde und es tat.

Meine Frage ist: Wenn ich Iostream einschließe, warum explodiert die Größe meiner ausführbaren Datei?

Edit: Ich bin mit G ++ (mit dem Dev-CPP IDE, aber ich kann herausfinden, wie CL Paramater hinzufügen)

+0

Ich möchte darauf hinweisen, dass Dev-C++ mit einer * sehr * alten Version von GCC kommt. Ziehen Sie in Erwägung, zu wxDev-C++ oder Code :: Blocks zu wechseln, die beide sehr viel aktueller sind. – greyfade

Antwort

6

In einem Wort enthält, Symbole.

Die C++ - Standardbibliothek führt ein Los von Symbolen zu Ihrem Programm ein, da das meiste der Bibliothek hauptsächlich in den Header-Dateien vorhanden ist.

Kompilieren Sie Ihr Programm erneut im Freigabemodus und ohne Debugsymbole, und Sie können leicht erwarten, dass das Programm deutlich kleiner ist. (. Kleinere immer noch, wenn Sie Symbole Streifen)

Als schnelle Demonstration dieser Tatsache beachten:

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

Ich kann nicht erklären, warum ein Windows-Build der Programme mit G ++ so großen ausführbaren Dateien erzeugt, aber Auf jeder anderen Plattform sind Symbole der Haupttreiber bei großen Dateigrößen. Ich habe im Moment keinen Zugriff auf ein Windows-System, daher kann ich nicht testen.

+1

+1! Sie können eine Menge Debugging-Symbole in STL finden. – jwueller

+0

Hallo, danke, dass du dir die Zeit genommen hast, die Ergebnisse zu machen. Ich habe dies in Windows mit den '-s -O3' Flags gemacht und die Dateigröße von 475kb auf 263kb reduziert. Es hilft, aber kann ich mehr tun? – Saustin

+1

@Saustin: Verwenden Sie einen neueren Compiler. Du benutzt eine, die * sehr * alt ist. Es kommt wahrscheinlich mit etwas cruft, das nicht auf die neueren Versionen aufgegossen wird. Dev-C++ wird sowieso nicht gepflegt, also gibt es keinen Grund, es weiter zu benutzen, wenn es so viele andere, bessere Möglichkeiten gibt. Ich meine, die letzte Veröffentlichung war 2005! – greyfade

7

Becuase Sie mithilfe iostreams in den meisten der Standard-Bibliothek gezogen haben. Es ist eine einmalige Sache obwohl, so wie Ihre Programme größer wird, wird es immer weniger Aufwand.

Allerdings möchten Sie wahrscheinlich mit einer freigegebenen Bibliothek Version der Standard-Bibliothek kompilieren und die meisten Compiler/Betriebssysteme können Sie dies tun, so dass Sie nicht alle Standard-Bibliothek in Ihre ausführbare Datei enthalten müssen. Welchen Compiler benutzen Sie und wir können Ihnen wahrscheinlich Tipps geben, wie Sie das tun.

Verwenden Sie bei Windows mit VC-Befehlszeile beispielsweise die Befehlszeilenoption/MD.

+0

Ich benutze G ++ w \ Dev-CPP. – Saustin

2

würde ich vermuten, dass <iostream>, indem Sie viele Teile der STL, wie <string> indirekt einschließlich der wiederum <vector> usw.

+0

Um diese Antwort in C-Termen zu setzen, ist es der Unterschied zwischen Putc und Printf. printf-Code hat eine Menge von Funktionalität, die (relativ) Ihre C ausführbare gegen eine einfache Putc-Funktion. Für Saustins Situation sind Methoden "riesig" relativ zu printf und STL ist "riesig" relativ zu . – franji1

2

Dies ist mehr ein Artefakt des Compilers (und der Optionen), die Sie als fast alles andere verwenden. Mit MS VC++, abhängig von den Compiler-Flags, die ich verwende, kann ich irgendwo zwischen ~ 8K und ~ 110K erreichen. Mit MinGW komme ich auf 24-25K (wieder, abhängig von Flags).

Nur für den Fall, dass Sie sich wundern, würde ich den größeren Bereich, den ich mit VC++ bekomme meist ein Ergebnis der Kenntnis seiner Flags besser. MinGW könnte nur einen kleineren Bereich abdecken, selbst wenn ich es besser wüsste, aber aufgrund meiner begrenzten Kenntnisse seiner Flaggen akzeptiere ich das meiste von dem, was es standardmäßig tut; Ich weiß, wie ich die Optimierung ein- und ausschalten kann, aber ich muss die Dinge sehr genau betrachten, um noch viel mehr zu tun.

1

MinGW (g ++) kompiliert wirklich große Dateien.
Zum Beispiel das gleiche "Hallo Welt" -Programm mit Iostreams compiliert zu ~ 100KB von VC++ (mit statisch verknüpften CRT) und zu ~ 470KB von g ++.

+0

Dies gilt immer noch für das neueste Visual Studio und MinGW w-64 mit GCC 7.2.0 (mit den Standard-Compiler-Flags, die CMake für Release-Builds verwendet). – clocktown

1

Dies ist ein Aspekt der , die eigentlich ganz wahr ist :)

Wissen Sie, wenn wir unseren ersten C++ Compiler hatte, bei AT & T, I 'Hallo Welt' kompiliert und couldn Ich glaube nicht an die Größe der ausführbaren Datei. 2.1MB

Was? Nun, Compiler haben seither einen langen Weg zurückgelegt.

Sie haben? Probieren Sie es auf der neuesten Version von g ++ - Sie werden nicht viel aus einem halben Megabyte ändern.

+1

Nicht wirklich hilfreich, aber etwas Humor hilft. – Saustin

Verwandte Themen