Mir ist aufgefallen, dass die exen der Programme, die ich mit Dev-C++ erstellt habe 1,21 MB groß sind und die gleichen Programme, wenn ich sie mit Microsoft Visual C++ 6.0 erstellt habe nur ein paar kb.
Warum das?
Mir ist aufgefallen, dass die exen der Programme, die ich mit Dev-C++ erstellt habe 1,21 MB groß sind und die gleichen Programme, wenn ich sie mit Microsoft Visual C++ 6.0 erstellt habe nur ein paar kb.
Warum das?
Weil in den EXE-Dateien verschiedene DLLs eingebunden werden, die auch unterschiedlich groß sind. Und das unabhängig davon, ob die DLL überhaupt komplett gebraucht wird. Das Gleiche beobachte ich auch bei meinen Programmen: Wenn ich in QBasic eine EXE erstelle, ist diese immer mindestens 5 KB groß, während in Visual Basic ein im Prinzip gleiches Programm fast 1,5 MB verbraucht... also 300mal größer als eigentlich nötig O_o .
Geändert von Manuel (14.08.2004 um 07:08 Uhr)
Hello World mit:
Virsual Basic (inclusive DLLs etc) 1,5 MB
Borland Delphi 400 KB
Pure Basic etwa 6 KB
Quelle pure-basic Webseite![]()
--Signature.
Das liegt unter anderem daran, dass der MS Compiler u.a. auf Größe optimiert, und das von Haus aus, und der GCC (bitte, Dev-C++ ist nur ein schön bunter Editor...) auf Geschwindigkeit, und erst mit den nötigen Flags auf Größe optimiert (frag mich allerdings nicht, wie die jetzt heissen... man g++ dürfte da Aufschluss geben...)
Man kann die .exe files auch hinterher schön mit Aspack packen, verkleinert oft um mehr als 50% und die Geschwindigkeit verändert sich nicht merklich
Du kannst versuchen, gcc mit dem Flag -O* aufzurufen, wobei * eine Zahl ist. -O3 sollte schon etwas Kleineres hervorbringen, kompiliert aber auch länger.
Es könnte auch eine gute Idee sein, die Binary nach dem Kompilieren mit strip zu bearbeiten.
Ich habe mal "Hello World" vier mal kompiliert und teilweise gestript. Hier die Ergebnisse (Anm: Unter Linux, deshalb sind die Binaries von Anfang an kleiner)BTW, erstellt MSVC überhaupt komplett lauffähige Binaries? AFAIK verlassen die sich stark auf eine C-Runtime, die mit Windows kommt. Das könnte ein Grund sein, warum sie so klein sind...
BTW2, UPX ist auch ein brauchbarer Packer für Binaries.
Geändert von Jesus_666 (14.08.2004 um 18:39 Uhr)
Hm, da es hier ja um EXE Grössen geht und ich keinen neuen Thread erstellen will, missbrauche ich diesen mal für meine Frage.
Mich würde mal interessieren wie man solch "Präsentationen" wie diese 64kb grosse Zoom 3 Demo so klein kriegen kann ^_-. Da muss man ja bitweise coden, und da würde mir spontan nur Assembler in den Sinn kommen, vorallem um den OpenGL Teil so klein wie möglich zu halten. Habe da aber wenig Erfahrung mit. Ich frage aus reinem Interesse.
au revoir ...
das ganze ist nicht openGL sondern DirectX9
Das ganze IST in Assembler gecoded (Assembly ist wohl die groesste Assemblermesse) und hier sind echte Profis am Werk.
Die haben extra neue Kompressionsalgorithmen entwickelt, um z.B. 70MB Musikdaten in 5.5Kb zu pressen .... ich hab keine Ahnung, wie die das gemacht haben ...
Im prinzip lebt das ganze davon, dass alles moegliche zur laufzeit berechnet wird, damit die die daten nicht schon vorher reinstecken muessen. Die musik wird ueber einen just in time softwaresynthesizer zur laufzeit zusammengebaut, aehnlich den klassischen trackerformaten.
Nichts desto trotz ist sowas eine echte meisterleistung, und ich geh wohl recht in der annahme, dass sowas vonuns hier keiner ohne weiteres auf die beine stellen kann ...
Nur so nebenher gesagt, ich weiß zwar nicht ob die Programme von Visual C++ ohne Runtime.dlls lauffähig sind, und deshalb auch nur 6 KB groß sind, aber unter PureBasic kann ich 4,5 KB Große Hello-Wolrd Programme erstellen welche komplett auf Amiga, Linux und WIndows portierbar sind. Ohne jegliche Runtimes. Es wäre also auch möglich, das MSVC++ auch ohne Runtime recht klein ist, PB ist es ja auch.
na ja .. trotzdem ist Assembler einfach das kleinste, was du erzeugen kannst ...
Mein ebend geschriebenes "Hallo Welt." Programm ist gerade mal 29 Byte gross. Zugegeben, es ist eine COM Datei, aber im Prinzip koennte man nen header davorsetzen, ein paar byte dazuschreiben, und haette eine Exe.
Hier einmal der Quellcode fuer nasm
Wie man sieht hab ich auf BIOS-Routinen zurueckgegriffen und nicht auf die lausige DOS-Routine int 21h. Wer benutzt schon $ als terminales Zeichen ? .. mein Prog handhabt so wenigstens Null-terminierte Strings ...
Ausserdem sollte so der Assemblercode auch recht leicht auf linux portierbar sein ...
und fuer alle, die es interessiert, hier der Maschienencode mit ASM-Entsprechung
Wenn man es genau betrachtet, ist das programm lediglich 15 Byte gross, der Rest sind ja die auszugebenden Daten ^^
es "interesiert" sogar SO viele Leute das sie gleich mal hier hintendran geschrieben haben
*guckguck*
öhm oder auch nicht ^^
ich glaube ich hätte den int 21h Interrupt benutzt , hatte sowie so nur ein bischen ASM ^^
aber um nochmal auf die 64kb dinger zurück zukommen die sind meistens sogar in C++ geschireben die Kbyte oder gar byte großen o_O
sind dann in ASM... die Assembly ist echt schon krass
und ja wir sind alle unwürdig :
zitat
"...
Nichts desto trotz ist sowas eine echte meisterleistung, und ich geh wohl recht in der annahme, dass sowas vonuns hier keiner ohne weiteres auf die beine stellen kann ..."
*g*
-> tut mir Leid ein bsichen Ironie muss mal ab und zu sein , ok? ^^°
ah ja wer noch mehr nette kleine Demos sucht kann ja hier gucken :
http://www.scene.org/
ich mag auch ein paar der größeren
036-zeitmaschine von farbrausch gehört zu meinen favoriten
MFG Shin Gouki
Geändert von Shin Gouki (02.09.2004 um 16:00 Uhr)
wenn du wert auf kleine exe dateien legst, kannst du in den linker options verhindern, dass die dll mitgelinkt werden, allerdings müssen die dlls auf dem system zur verfügung stehen. dh entweder an einem ort wo die umgebungsvariabel pfad richtig gesetzt ist oder sie muss im gleichen dir sein wie die exe.
übrigens kannst du bei devcpp unter den optionen optimierungen vornehmen, so dass du auch kleine exes bekommst.