Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

Optimierungsoptionen

&pagelevel(4)&pagelevel

Wenn keine der folgenden Optionen zur Optimierung angegeben wird, führt der Compiler keine Optimierungen durch. Dieses Verhalten entspricht der SDF-Option LEVEL=*LOW.

Die einzelnen Optimierungsmaßnahmen und ihre Auswirkungen sind ausführlich im C/C++-Benutzerhandbuch [4] im Abschnitt „Verlauf der Optimierung“ dargestellt.

-O
-F O2

Diese Optionen schalten die Standardoptimierung des Compilers ein. Der Unterschied zwischen diesen beiden Optionen besteht darin, dass bei -O intern jede Optimierungsstrategie nur einmal durchgeführt wird, bei -F O2 mehrmals. Entsprechend wird in der Optimierungsstufe -O deutlich weniger Übersetzungszeit benötigt als in der „hochoptimierenden“ Stufe -F O2.

Der Compiler führt folgende Standardoptimierungen durch:

  • Berechnung konstanter Ausdrücke zur Übersetzungszeit

  • Optimierung der Indexrechnung in Schleifen

  • Eliminierung unnötiger Zuweisungen

  • Propagation konstanter Ausdrücke

  • Eliminierung redundanter Ausdrücke

  • Optimierung von Sprüngen auf unbedingte Sprungbefehle

Außerdem wird eine Registeroptimierung durchgeführt.

Im Unterschied zur SDF-Option (Optimierungsstufe *HIGH bzw. *VERY-HIGH ohne Parameter) ist die Schleifenexpansion ausgeschaltet.

Wenn die Standardoptimierung nicht explizit mit -O oder -F O2 eingeschaltet ist, wird sie automatisch in der Stufe -O aktiviert, wenn die Optionen -F loopunroll (Schleifenexpansion) oder -F i, -F inline_by_source (Inline-Generierung von Benutzer-Funktionen) angegeben werden.

-F I[name]

Mit dieser Option kann angegeben werden, für welche C-Bibliotheksfunktionen die Implementierung im CRTE angenommen werden kann. Dies erlaubt eine bessere Optimierung des Programms.
Bei Angabe von -F I ohne name werden alle Aufrufe zu bekannten C-Bibliotheksfunktionen gesondert behandelt.
Wird die Option -F I nicht angegeben, so wird kein Aufruf gesondert behandelt.
Bei Angabe von -F Iname (ohne trennendes Leerzeichen) wird nur die Funktion name gesondert behandelt.
Sollen mehrere Funktionen gesondert behandelt werden, muss die Option -F Iname mehrfach angegeben werden.

Die Option -F I kann unabhängig von der normalen Optimierung angegeben werden.

Den größten Effekt erreicht der Compiler durch Inline-Generierung einer Funktion. Dabei wird der Funktionscode direkt in die Aufrufstelle eingesetzt. Zeitaufwendige Verwaltungsaktivitäten des Laufzeitsystems (z.B. Register retten und restaurieren, Rücksprung aus der Funktion) fallen weg. Die Progamm-Ablaufzeit wird damit verkürzt.

Folgende C-Bibliotheksfunktionen können inline generiert werden:

abs

strcat

fabs

strlen

labs

strcmp

memcmp

strncmp

memcpy

strcpy

memset


Inline generierte Funktionen können weder zum Bindezeitpunkt durch andere Funktionen ersetzt noch beim Testen mit AID als Testpunkte benutzt werden.

Für die Inline-Generierung von C-Bibliotheksfunktionen braucht die Standardoptimierung des Compilers nicht eingeschaltet zu sein.

Der Compiler kennt die Semantik der CRTE-Bibliotheksfunktionen. Mit der Option -F I name teilt man dem Compiler mit, optimierte Funktionen zu generieren, die semantisch den CRTE-Bibliotheksfunktionen entsprechen. Ist kein Name angegeben, sollte der Compiler sein Wissen um alle CRTE-Funktionen nutzen (dem Compiler sind etwa 150 Funktionen bekannt).

Nicht inline generierte Funktionen bleiben als Aufruf erhalten. Es sind jedoch Optimierungen möglich, die bei Benutzer-Funktionen nicht machbar sind. Zum Beispiel kann der Compiler die Information nutzen, dass die Funktion isdigit() keine Seiteneffekte hat.

Einige Funktionen sind sehr speziell, da sie komplett inline generiert werden. Für diese Funktionen erzeugt der Compiler den Code direkt, ohne an CRTE zu übergeben. Diese Funktionen sind in der obigen Tabelle aufgeführt.

In einigen Fällen ist diese Optimierung unerwünscht. Falls das Programm fehlerbereinigt werden soll, möchten Sie evtl. einen Breakpoint in einer solchen Funktion setzen. Dies ist bei komplett inline generierten Funktionen nicht möglich. (Genauer: Sie können zwar einen Breakpoint setzen, doch wird dieser nicht erreicht. Benutzt wird der vom Compiler generierte Code, nicht die Funktion, bei der der Breakpoint gesetzt wurde.)

Ein anderer Fall liegt vor, wenn eine Funktion mit einem dem Compiler bekannten Namen selbst definiert wurde. In den meisten Fällen wird diese Funktion eine von CRTE unterschiedliche Semantik besitzen. Kommt es zu einem Konflikt zwischen einer solchen selbstdefinierten Funktion und dieser Option, vermuten alle Aufrufe die CRTE-Semantik. Die Warnung CFE2067 wird in diesem Fall ausgegeben.

Beachten Sie, dass die CRTE-Semantik in jeder Übersetzungseinheit benutzt wird. Die Warnung wird nur in der Übersetzungseinheit ausgegeben, die die private Definition enthält.

-F i[name]
-F inline_by_source

Diese alternativ zu verwendenden Optionen steuern die Inline-Generierung von benutzereigenen Funktionen. Wie auch bei der Inline-Generierung von einigen C-Bibliotheksfunktionen aus der Standardbibliothek (siehe -F I ) wird jeder Aufruf einer Inline-Funktion durch den entsprechenden Funktionscode ersetzt; durch die Einsparung der Aufruf- und Rücksprung-Codefolge wird eine bessere Ablaufzeit erzielt. Bei Angabe der Optionen -F i, -F i name oder -F inline_by_source wird gleichzeitig die Standardoptimierung (-O) aktiviert, es sei denn -F O2 wurde explizit gesetzt.

-F i und -F i name
Bei Angabe von -F i mit oder ohne name wählt der Compiler Funktionen für die Inline-Generierung nach eigenen Kriterien aus. Ggf. im Quellprogramm vorhandene inline-Pragmas und C++-sprachspezifische Inline-Funktionen werden vom Compiler bei der Suche nach geeigneten Kandidaten automatisch mitberücksichtigt (siehe auch -F inline_by_source).

Bei Angabe von name (ohne trennendes Leerzeichen!) wird zusätzlich die Funktion name inline generiert. Sollen mehrere selbstgewählte Funktionen vom Compiler bei der Inline-Generierung berücksichtigt werden, muss die Option -F i name mehrmals angegeben werden.
Die Angabe von -F i name wird bei C++-Übersetzungen, d.h. beim CC-Kommando ignoriert.

-F inline_by_source
Bei Angabe dieser Option werden ausschließlich folgende benutzereigene Funktionen inline generiert:

  • Bei C-Übersetzungen (cc, c11c89) C-Funktionen, die mit der Anweisung #pragma inline name deklariert sind (siehe auch Abschnitt „inline-Pragma“ im C/C++-Benutzerhandbuch [4]). Das inline-Pragma wird in C++ nicht unterstützt.

  • Bei C++-Übersetzungen (CC) die C++-sprachspezifischen Inline-Funktionen. Dies sind innerhalb von Klassen definierte Funktionen sowie Funktionen mit dem Attribut inline.

Hinweis zu Inline-Funktionen in C++
Die Inline-Generierung der C++-sprachspezifischen Inline-Funktionen wird auch dann durchgeführt, wenn die Optimierung nicht eingeschaltet ist bzw. wenn die Optionen -F i oder -F inline_by_source nicht gesetzt sind. Dies kann mit der Option -F no_inlining unterdrückt werden.

-F loopunroll[,n]

Diese Option steuert die Expansion von Schleifen. Durch eine mehrmalige Expansion des Schleifenrumpfes wird eine geringere Ausführungszeit für die Schleifendurchläufe erzielt. Standardmäßig unterbleibt diese Optimierungsmaßnahme. Bei Angabe dieser Option wird automatisch die Standardoptimierung (-O) aktiviert, es sei denn -F O2 wurde explizit gesetzt.

Bei Angabe von -F loopunroll ohne n werden vom Compiler Schleifenrümpfe 4 mal expandiert. Mit n kann ein eigener Expansionsfaktor ausgewählt werden, wobei n ein Wert zwischen 1 und 100 sein kann.

Die Angabe von -F loopunroll[,n ] garantiert nicht, dass der Optimierer in jedem Fall eine Schleifenexpansion ausführt: Der Optimierer entscheidet dies in Abhängigkeit von der Schleifenstruktur sowie vom angegebenen Faktor n.

-F no_inlining

Mit dieser Option kann die Inline-Generierung der C++-sprachspezifischen Inline-Funktionen unterdückt werden, die standarmäßig auch dann durchgeführt wird, wenn die Optionen -F i oder -F inline_by_source nicht angegeben werden.
Wenn -F no_inlining gleichzeitig mit der Option -F i oder -F inline_by_source angegeben wird, gilt die jeweils letzte Angabe in der Kommandozeile.
Ist -F no_inlining als Letztes angegeben, wird die ursprünglich angeforderte Inline-Generierung auch von benutzereigenen C-Funktionen nicht durchgeführt (die implizit gesetzte Optimierung -O bleibt allerdings eingeschaltet).
Die mit der Option -F I eingeschaltete Inline-Generierung von C-Bibliotheksfunktionen wird durch -F no_inlining nicht beeinflusst.