2009-10-08 8 views

Antwort

15

http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

Es gibt keine ‚one size fits all‘ - Sie benötigen, um Ihre Anwendung, Ihre Anforderungen und die Optimierungsflags zu bestimmen, die richtige Teilmenge für die Binärdatei zu verstehen.

Oder die Antwort, die Sie wollen: O3

+0

Ich tat und konnte keine direkte Erklärung finden. Ich könnte aber nur auf Suche lutschen. – Polaris878

+2

Außerdem ist der Punkt von SO, in Suchmaschinen wie Google aufzutauchen, also ist es besser, es hier sowieso zu haben. – Polaris878

+0

Fairer Anruf. Wolltest du das? Oder brauchst du ein bisschen mehr Kontext/Info? – Josh

3

-O2 auf allen Optimierungen drehen wird, dass derjenige zu sein, keinen Raum \ Geschwindigkeit Handel benötigen ab und neigt dazu, die ich am häufigsten gebraucht. -O3 bietet Platz für Geschwindigkeits-Trade-offs (wie Funktion inline). -Os macht O2 plus andere Dinge, um die Code-Größe zu reduzieren. Dies kann Dinge schneller machen als O3, indem die Cache-Nutzung verbessert wird. (Testen Sie, ob es für Sie funktioniert.) Beachten Sie, dass es eine große Anzahl von Optionen gibt, die keiner der O-Schalter berührt. Der Grund, warum sie weggelassen werden, ist, dass es oft davon abhängt, welche Art von Code Sie schreiben oder sehr architekturabhängig sind.

7

Beachten Sie, dass gcc keinen "release mode" und keinen "debug mode" wie MSVC hat. Der gesamte Code ist nur Code. Das Vorhandensein der verschiedenen Optimierungsoptionen (-O2 und -Os sind die einzigen, die Sie im Allgemeinen beachten müssen, es sei denn, Sie führen eine Feinabstimmung durch) ändert den generierten Code, jedoch nicht so, dass die Interoperabilität mit anderen ABI-kompatiblen Systemen verhindert wird Code. Im Allgemeinen möchten Sie Optimierung auf Sachen, die Sie freigeben möchten.

Das Vorhandensein der Option "-g" bewirkt, dass erweiterte Symbol- und Quellcodeinformationen in die generierten Dateien eingefügt werden, was beim Debuggen hilfreich ist, aber die Größe der Datei erhöht (und Ihren Quellcode preisgibt) ist etwas, das du oft nicht in "freigegebenen" Binärdateien willst.

Aber sie sind nicht exklusiv. Sie können eine Binärdatei mit Optimierungs- und Debug-Informationen kompilieren oder eine mit keiner.

+1

Die Optimierung sollte normalerweise deaktiviert werden, wenn Sie beabsichtigen, den generierten Code zu debuggen, andernfalls werden Sie feststellen, dass das Debugging eine Erfahrung ist, die einem David Lynch-Film ähnelt. – caf

+0

Es ist nicht so schlimm, ich schaue Stack-Dumps und valgrind Ausgabe von "Release" Binaries die ganze Zeit. Solange Sie nicht den -fomit-stack-pointer verwenden und verstehen, dass Statiken inline und unsichtbar sein können, können Sie sogar aus einer stark optimierten Binärdatei eine Menge Kontexte lesen. Wenn Ihre Funktionen kurz sind, können Sie normalerweise den Ausdruck herausfinden, der mit ein oder zwei Raten abgestürzt ist. –

+0

Im Gegensatz zu einem David-Lynch-Film lassen Debugger jedoch den Betrachter beliebig zwischen den verschiedenen Realitätsebenen hin- und herschalten. Wenn Sie Disassemblierung verstehen, dann macht das einzelne Durchlaufen (mit den eingestreuten Quellzeilen) in der Regel auch bei der Optimierung Sinn. Wenn Sie die Demontage nicht verstehen, werden Sie lernen. –

15

Hier ist ein Teil von einem Makefile, das ich regelmäßig verwende (in diesem Beispiel wird versucht, ein Programm mit dem Namen foo zu erstellen).

Wenn Sie es wie $ make BUILD=debug oder $ make debug dann die Debug CFLAGS verwendet werden ausgeführt. Diese schalten die Optimierung aus (-O0) und enthalten Debugsymbole (-g).

Wenn Sie diese Flags weglassen (durch $ make ohne zusätzliche Parameter ausgeführt wird), werden Sie bauen die Veröffentlichung CFLAGS-Version, wo Optimierung auf (-O2) eingeschaltet ist, Debugging-Symbolen (-s) und Behauptungen deaktiviert (-DNDEBUG) .

Wie andere vorgeschlagen haben, können Sie mit verschiedenen Einstellungen -O* experimentieren, abhängig von Ihren spezifischen Bedürfnissen.

ifeq ($(BUILD),debug) 
# "Debug" build - no optimization, and debugging symbols 
CFLAGS += -O0 -g 
else 
# "Release" build - optimization, and no debug symbols 
CFLAGS += -O2 -s -DNDEBUG 
endif 

all: foo 

debug: 
    make "BUILD=debug" 

foo: foo.o 
    # The rest of the makefile comes here... 
Verwandte Themen