wake-up-neo.net

Optimierung und Flags zum Erstellen einer statischen Bibliothek mit g ++

Ich fange gerade mit dem g ++ - Compiler unter Linux an und habe einige Fragen zu den Compiler-Flags. Hier sind sie

Optimierungen

Ich habe in der g ++ - Manualpage über Optimierungsflags -O1, -O2 und -O3 gelesen. Ich habe nicht verstanden, wann ich diese Flaggen benutzen sollte. Welchen Optimierungsgrad verwenden Sie normalerweise? Das g ++ - Handbuch sagt folgendes für -O2.

Noch mehr optimieren. GCC führt fast alle unterstützten Optimierungen durch, die keinen Kompromiss zwischen Weltraum und Geschwindigkeit erfordern. Der Compiler führt bei der Angabe von -O2 keine Schleifenabwicklung oder Inlining durch. Im Vergleich zu -O erhöht diese Option sowohl die Kompilierungszeit als auch die Leistung des generierten Codes. 

Wenn nicht Inlining und Loop-Rolling durchgeführt werden, wie wird die Leistung erzielt und wird diese Option empfohlen?

Statische Bibliothek

Wie erstelle ich eine statische Bibliothek mit g ++? In Visual Studio kann ich ein Klassenbibliothekprojekt auswählen, das in eine "lib" -Datei kompiliert wird. Was ist das Äquivalent in g ++?

30
Navaneeth K N

Die Faustregel:

Verwenden Sie zum Debuggen -O0 (und -g, um Debugging-Symbole zu generieren.)

Wenn Sie den Versand vorbereiten, verwenden Sie -O2.

Wenn Sie gentoo verwenden, verwenden Sie -O3 ...!

Wenn Sie ein Embedded-System verwenden möchten, verwenden Sie -Os (Größe und nicht die Effizienz).

41
Josh K

Das gcc-Handbuch listet alle implizierten Optionen für jede Optimierungsstufe auf. Bei O2 erhalten Sie Dinge wie konstantes Falten, Verzweigungsvorhersage und Co, die die Geschwindigkeit Ihrer Anwendung je nach Code erheblich verändern können. Die genauen Optionen sind versionsabhängig, jedoch ausführlich dokumentiert.

Um eine statische Bibliothek zu erstellen, verwenden Sie ar wie folgt:

ar rc libfoo.a foo.o foo2.o ....
ranlib libfoo.a

Ranlib ist nicht immer notwendig, aber es gibt keinen Grund, es nicht zu verwenden.

6

Wann wird welche Optimierungsoption verwendet? Es gibt keine richtige Antwort.

Bestimmte Optimierungsstufen können manchmal die Leistung beeinträchtigen. Dies hängt von der Art des Codes, den Sie schreiben, und dem Ausführungsmuster ab und hängt von der jeweiligen CPU ab, auf der Sie laufen.

(Um ein einfaches kanonisches Beispiel zu geben: Der Compiler entscheidet möglicherweise, eine Optimierung zu verwenden, die den Code etwas größer macht als zuvor. Dies kann dazu führen, dass ein bestimmter Teil des Codes nicht mehr in den Anweisungscache passt, woraufhin viel mehr Zugriffe erfolgen Speicher wäre erforderlich - zum Beispiel in einer Schleife).

Am besten messen und optimieren Sie für alles, was Sie brauchen. Versuchen, messen und entscheiden.

Eine wichtige Faustregel: Je mehr Optimierungen für Ihren Code ausgeführt werden, desto schwieriger ist es, ihn mit einem Debugger zu debuggen (oder seine Demontage zu lesen), da sich die C/C++ - Quellansicht weiter von der generierten Binärdatei entfernt. Aus diesem Grund ist es eine gute Faustregel, beim Entwickeln/Debuggen mit weniger Optimierungen zu arbeiten.

4
Hexagon

Es gibt viele Optimierungen, die ein Compiler durchführen kann, mit Ausnahme der Schleifenabwicklung und des Inlining. Loop-Abrollen und Inlining werden dort besonders erwähnt, da sie zwar den Code schneller machen, ihn aber auch größer machen.

Um eine statische Bibliothek zu erstellen, generieren Sie die .o-Dateien mit 'g ++ -c' und mit 'ar' in einer Bibliothek.

2
Tal Pressman

In Bezug auf die statische Bibliotheksfrage ist die Antwort von David Cournapeau richtig, aber Sie können alternativ das Flag 's' mit 'ar' verwenden, anstatt Ranlib in Ihrer statischen Bibliotheksdatei auszuführen. Die 'ar' Handbuchseite besagt das 

Das Ausführen von Ars in einem Archiv entspricht dem Ausführen von Ranlib.

Welche Methode Sie auch verwenden, hängt von Ihren persönlichen Vorlieben ab.

0
badPhysicist