Es bedeutet, dass Sie den Compiler dazu bringen, während der Kompilierung zusätzliche Arbeit / Analyse zu machen, damit Sie zur Laufzeit einige wertvolle CPU-Zyklen belohnen können. Könnte am besten mit einem Beispiel erklären.
Betrachten Sie eine Schleife wie folgt:
%Vor%Wenn Sie dies ohne Optimierungen kompilieren, wird der Compiler keine zusätzliche Arbeit für Sie erledigen - die Assembly, die für dieses Code-Snippet generiert wird, ist wahrscheinlich eine wörtliche Übersetzung in Vergleichs- und Sprungbefehle. (Das ist nicht das schnellste, nur das einfachste)
Wenn Sie jedoch WIT-Optimierungen kompilieren, kann der Compiler leicht inline
diese Schleife setzen, da er weiß, dass die obere Grenze niemals geändert werden kann, weil n
const
ist. (d. h. es kann den wiederholten Code 5 mal direkt kopieren, anstatt die Endschleifenbedingung zu vergleichen / zu prüfen).
Hier ist ein weiteres Beispiel mit einem optimierten Funktionsaufruf. Unten ist mein ganzes Programm:
%Vor% Wenn ich diesen Code ohne Optimierung mit gcc foo.c
auf meiner x86-Maschine kompiliere, sieht meine Assembly so aus:
Hier wird nichts optimiert. Es lädt die Register mit meinen konstanten Werten und ruft meine Funktion foo
auf. Aber schau, ob ich mit dem -O2
-Flag neu kompiliere:
Der Compiler ist so schlau, dass er nicht einmal foo
aufruft. Es zeigt nur den Rückgabewert an.
Der größte Teil der Optimierung findet in der Zwischenrepräsentation des Compilers statt, bevor die Assembly generiert wird. Sie sollten sich unbedingt Agner Fogs Software-Optimierungs-Ressourcen ansehen. Kapitel 8 des 1. Handbuchs beschreibt Optimierungen, die der Compiler mit Beispielen durchführt.
Tags und Links c++ compiler-optimization