C++-exe Größe-Vergleich
-
Athar schrieb:
Wie gesagt, VC++ linkt die C++-Runtime normalerweise dynamisch, MinGW dagegen statisch.
Aber auch, wenn man mit VS (ich hab hier VS 2008) statisch linkt, ist der Unterschied gewaltig. Für
#include <iostream> int main() { std::cout << "Hello World\n"; }ergeben sich mit g++ (3.4.5 mingw special) 477 KB, mit VS (cl - Version 15.00.30729.01) 96 KB, jeweils ohne irgendwelche Optimierungsschalter einfach von der Kommandozeile aus aufgerufen.
-
Vlt hängt MinGW irgendetwas per Default dran, was MSC nichtmacht? Irgendwelche Symbole?
-
Ethon schrieb:
Vlt hängt MinGW irgendetwas per Default dran, was MSC nichtmacht? Irgendwelche Symbole?
Ja, Symbolnamen. Fairerweise muss man beim GCC mit -s linken.
Und beim GCC wird die (schwergewichtige) locale-Bibliothek vollständig mitgelinkt, auch wenn die nur in Teilen gebraucht wird (weil sich alles in der gleichen Objektdatei befindet).
Bei MSVC erhöht sich die Executablegröße gleich nochmal, wenn man statt "Hello World!" z.B. 3.14 ausgibt, da scheint das also etwas feinkörniger zu sein.Ich frage mich, ob sich der GCC es gefallen ließe, wenn man libstdc++ und libgcc mit aktivierter LTO linken würde.
Damit könnte nicht benötigtes herausgeworfen werden, aber man müsste diese Bibliotheken erst einmal mit -flto neu bauen. Wer also mal Lust hat...
-
Hello World war noch nie ein besonders gutes Beispiel für Benchmarking...
-
Du bist herzlich aufgerufen, ein anderes Beispiel (C++ wohlgemerkt, bei reinem C-Code erstellt der GNU-Compiler kleinere Dateien) zu posten, bei dem g++ eine kleinere exe - Datei erzeugt als cl.
-
Belli schrieb:
Du bist herzlich aufgerufen, ein anderes Beispiel (C++ wohlgemerkt, bei reinem C-Code erstellt der GNU-Compiler kleinere Dateien) zu posten, bei dem g++ eine kleinere exe - Datei erzeugt als cl.
Selbes Beispiel, unter Linux kompiliert:
#include <iostream> int main() { std::cout << "Hello World\n"; }[ethon@Slaybook ~]$ g++ -Os -s -o hello hello.cpp
[ethon@Slaybook ~]$ size hello
text data bss dec hex filename
1817 600 296 2713 a99 helloca 5kb.
Also schieben wir es mal lieber auf den Mist den MinGw macht und nicht g++, ok?Edit: Upps, .exe überlesen ...
-
Außerdem wird libstdc++ unter Linux standardmäßig dynamisch gelinkt. Wenn du mit -static linkst, sieht es gleich wieder ganz anders aus.
-
Was interessiert da die IDE? Die IDE ruft den gcc auf. Und dem gcc ist es egal, ob es über eine IDE oder einen Makefile oder wie auch immer aufgerufen wird. Es ist ja auch egal, mit welchem Editor ich den Sourcecode eingetippt habe.
Bei mir kommt übrigens mit -Os und strip exakt 5000 Bytes raus. Na ja - ist auch Linux und dynamisch gelinkt.
Also sagen wir mal, dass gcc prinzipiell erst mal kleine Binaries erzeugen kann. Dann wäre die Schuld entweder in den Compileroptionen oder in dem Windows-Port zu suchen.
-
Hmm, merkwürdiges Problem.
Ich schaue mir gerade Gimp Plugins unter Windows an und entwickele dazu eine Klasse unter Codeblocks. Mein Mini-Plugin (Plugins unter Gimp sind EXE Dateien) belegt mit allen gerade mal 70 kByte in der Debug Version.
-
Bitte ein Bit schrieb:
Hmm, merkwürdiges Problem.
Ich schaue mir gerade Gimp Plugins unter Windows an und entwickele dazu eine Klasse unter Codeblocks. Mein Mini-Plugin (Plugins unter Gimp sind EXE Dateien) belegt mit allen gerade mal 70 kByte in der Debug Version.
Naja, die müssen ja fast dynamisch gelinkt werden.