14. marts 2000 - 07:54Der er
14 kommentarer og 1 løsning
MVC++6 && exefils størrelse.
Hvem kan få programmet: int main() { return 0; }
til at fylde så lidt så muligt, kompileret i MVC++6? Hvor sørgeligt det end lyder, er mit bedste hidtidige bud 86.065 bytes :) Så kom med et bytetal, og en udførlig forklaring på hvordan det er gjort.
Svante
PS: Ved lige små programmer vinder den der først indsender det.
Arghhh...det er ved disse settings jeg får ovenstående :( Dog SKAL jeg vælge Win32(console), bruger du MVC++6??? Hvis ja, må du siges at føre, selv om jeg ikke kan se hvordan?
Du kan starte med at lave dit program om til en console-application - og dernæst fjerne alle options omkring sammen-linkning med MFC, OWL og klassebiblioteker, samt al dannelse af debug information - både af compiler & af linker. Dernæst skal du slå alle exception handlers fra.
Under C++ Builder reducerer det størrelsen fra ca. 64Kb til 48Kb, men så kan jeg heller ikke komme længere ned.
Grunden til at du ikke komme længere ned, er at Windows compilerne lægger en masse standard kode ind for at "skidtet" kan køre under windows - det er bl.a. ting som tilføjelse til task-lister, oprettelse af ikon i 'start' menuen osv., samt kode til parsing af evt. parametre.
Hvis du vil af med dette (- parsing af parametre), er der ingen vej uden om at anvende end DOS-orienteret compiler, f.eks. BC 5.02, (10.052) eller endnu bedre TC++ 3.0. (5.860) Selve koden fylder i sidstnævnte compiler 12 (!) bytes - resten er standard funktionalitet.
Ja jeg bruger MVC++6, men console hedder Win32 Console Application
Der er mange kopiler optimeringer fra version til version, f.eks. et program lavet i v. 4 rekompilerede jeg i v. 6. Execs størrelse faldt fra 147k til 116k med fuldstændigt den samme sourcekode !?
Dette er hovedsaligt pga. /OPT:REF hvor kopileren kun bruger de ting man anvender selvom man har included en masse, f.eks. når man ikke bruger cout,cerr,clog eller den sidste som jeg aldrig bruger(og derfor ikke kan huske hvad hedder) så includer den ikke comdlg.dll. Resultat execens størrelse falder med adskillige k.
Hvad med com filer, kan de laves i MVC++6? Jeg har selv lavet en comfil på 2 bytes i notepad (uendelig løkke :). Men hvordan laves det eventuelt i de store compilere?
I MVC kan du -mig bekendt- flytte en hel del kode til standard (Microsoft) DLL'er, ved at lave en version som anvender DLL-libraries fremfor at linke koden direkte ind i EXE'n. C++ Builder kan ikke i samme grad gøre dette (sikkert fordi Microsoft ikke ønsker at andre skal kende DLL'erne), hvilket sikkert er grunden til at man kan komme ned på 24Kb i MVC og kun 48Kb i BCB.
Du kan jo (også) anvende ASM i MVC & BCB, men det fjerner jo ikke standard-koden. En kollega lavede på et tidspunkt sine egne 'startup' kode versioner til TC++ 3.0 for at reducere kodestørrelsen til et minimum, når han f.eks. ikke skulle bruge kommando-linie parametre, åbne standard filer osv. - men er det ikke lidt "overkill" i Windows-miljø ?!? Jeg mener, (relativt) store exe-filer er en af de "downsides" vi må leve med, hvis vi vil anvende alle de gode ting i windows.
Jo vist er det overkill, men det er det eneste jeg vil. Overkill'e helt vildt. Og det IRRITERER mig, at man ikke kan presse koden ned på eksempelvis de 12 bytes, som du nævner ovenfor, soepro. Det MÅ da være muligt, selv om det er en kæmpe enterprise compiler ting, at lave de små ting også? Muligvis ikke let, men MULIGT? Bedre bud på spørgsmålet ønskes!
Ligegyldigt hvor meget du prøver kan du ikke komme ret meget længere ned i koden. Windows exe filer er PE filer som har et predefineret format der skal overholdes. Compilere, som de skumle væsner de nu er, gør det let for sig selv ved at forcere alle funktioner på forskellige byte boundaries i PE formatet, samt 'aligne' alting på en måde der gør det let for loaderen.
Den eneste mode du kan reducere det yderligere på er ved at åbne din Hex editor og så klippe og klistre din exe fil til den rette størrelse - efter PE formattet selvfølgelig. Så kan du vel nok få den ned under de 20 KB. Dit program vil derefter sikkert også køre langsommere end ved et almindeligt kompileret program.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.