GCC: Richtig optimieren
-
Es ist ja ein bekanntes Problem: GCC erzeugt ohne zutun oft recht große Binaries. So macht es aus einem nicht allzu umfangreichen Programm das außer iostream nichts included hat trotz -fexpensive-optimizations -O3 -march=pentium4 -msse2 ein mit 263KB noch recht großes Programm, andere Compiler schneiden da erheblich besser ab. Ich habe mit GCC noch nicht so viel Erfahrung und suche nach Tricks, um mit GCC möglichst kleine(re) Executables zu erzeugen.
-
BloodLord schrieb:
Es ist ja ein bekanntes Problem: GCC erzeugt ohne zutun oft recht große Binaries. So macht es aus einem nicht allzu umfangreichen Programm das außer iostream nichts included hat trotz -fexpensive-optimizations -O3 -march=pentium4 -msse2 ein mit 263KB noch recht großes Programm, andere Compiler schneiden da erheblich besser ab. Ich habe mit GCC noch nicht so viel Erfahrung und suche nach Tricks, um mit GCC möglichst kleine(re) Executables zu erzeugen.
ich teste mal selbst.
zunächst mache ich -Wall -Werror an, weil das gut für die fehlersuche ist. hat keinen effekt auf die größe.
und noch -pipe, da compiliert er angeblich ein wenig schneller.ich mache make und schaue: 1072085
der größte teil davon sind debug-informationen. die hat man mit -s weg.
ich mache -s dazu an und schaue: 269824
mal schauen, was optimieren bringt.
ich mache -O3 dazu an und schaue: 269312
nix. mal schauen, was das ausschalten von assert bringt.
ich mache --DNDEBUG dazu an und schaue: 269312
naja, beliebt ist auch -fomit-frame-pointer
ich mache -fomit-frame-pointer dazu an und schaue: 269312
also groß bleibt die exe, sobald man cout benutzt. das einzuge, was ich mir denken könnte, wäre, wenn die linuxer inzwischen cout in ein shared-object gepackt hätten. ist das der fall?
-
Mit "-Os -fomit-frame-pointer -s -o hello -DNDEBUG" produziert der g++ bei mir ganz brauchbar kleine Binaries.
BloodLord: Hä? Warum soll denn durch -O3 und -fexpensive-optimizations das Programm kleiner werden?
-
Ähmm, das -fomit-frame-pointer kann man sich aber doch sparen? Ist afaik eh in allen (außer -O0) drin.
-
TactX schrieb:
Ähmm, das -fomit-frame-pointer kann man sich aber doch sparen? Ist afaik eh in allen (außer -O0) drin.
Nein, auf x86 nicht:
`-O' also turns on `-fomit-frame-pointer' on machines where doing so does not interfere with debugging.
-
Ah, O.K. Danke.