/OPT (Optimierungen)
Steuert die Optimierungen, die während eines Builds von LINK ausgeführt werden.
Syntax
/OPT:{REF | NOREF}
/OPT:{ICF[=Iterationen] | NOICF}
/OPT:{LBR | NOLBR}
Argumente
BEZUG | NOREF
/OPT:REF beseitigt Funktionen und Daten, auf die nie verwiesen wird; /OPT:NOREF behält Funktionen und Daten bei, auf die nie verwiesen wird.
Wenn /OPT:REF aktiviert ist, entfernt LINK nicht referenzierte verpackte Funktionen und Daten, die als COMDATs bezeichnet werden. Diese Optimierung ist als transitive COMDAT-Eliminierung bekannt. Die Option "/OPT:REF " deaktiviert auch die inkrementelle Verknüpfung.
Inlineierte Funktionen und Memberfunktionen, die in einer Klassendeklaration definiert sind, sind immer COMDATs. Alle Funktionen in einer Objektdatei werden in COMDATs erstellt, wenn sie mithilfe der Option /Gy kompiliert wird. Um Daten in COMDATs zu platzieren const
, müssen Sie sie mithilfe von __declspec(selectany)
COMDATs deklarieren. Informationen zum Angeben von Daten zum Entfernen oder Falten finden Sie unter Selectany.
Standardmäßig ist /OPT:REF vom Linker aktiviert, es sei denn,/OPT:NOREF oder /DEBUG ist angegeben. Wenn Sie diese Standardeinstellung außer Kraft setzen und nicht referenzierte COMDATs im Programm beibehalten möchten, geben Sie /OPT:NOREF an. Sie können die Option "/INCLUDE " verwenden, um das Entfernen eines bestimmten Symbols außer Kraft zu setzen.
Wenn /DEBUG angegeben ist, ist die Standardeinstellung für /OPT NOREF, und alle Funktionen werden im Bild beibehalten. Um diese Standardeinstellung außer Kraft zu setzen und einen Debugbuild zu optimieren, geben Sie /OPT:REF an. Dies kann die Größe Ihrer ausführbaren Datei verringern und kann auch bei Debugbuilds eine nützliche Optimierung sein. Es wird empfohlen, auch "/OPT:NOICF" anzugeben, um identische Funktionen in Debugbuilds beizubehalten. Dadurch wird es einfacher, in Funktionen, die andernfalls gefaltet würden, Stapelüberwachungen zu lesen und Haltepunkte festzulegen.
ICF[=Iterationen] | NOICF
Verwenden Sie ICF[=Iterationen] zum Ausführen identischer COMDAT-Faltungen. Redundante COMDATs können aus der Linkerausgabe entfernt werden. Der Parameter für optionale Iterationen gibt an, wie oft die Symbole für Duplikate durchlaufen werden sollen. Die Standardanzahl der Iterationen ist 1. Zusätzliche Iterationen können mehr Duplikate auffinden, die bei der Faltung in vorherigen Iterationen unentdeckt blieben.
Standardmäßig ist /OPT:ICF vom Linker aktiviert, es sei denn,/OPT:NOICF oder /DEBUG ist angegeben. Um diese Standardeinstellung außer Kraft zu setzen und zu verhindern, dass COMDATs im Programm gefaltet werden, geben Sie /OPT:NOICF an.
In einem Debugbuild müssen Sie explizit /OPT:ICF angeben, um DIE COMDAT-Faltung zu aktivieren. Da /OPT:ICF jedoch identische Daten oder Funktionen zusammenführen kann, kann sie die Funktionsnamen ändern, die in Stapelablaufverfolgungen angezeigt werden. Es kann auch unmöglich machen, Haltepunkte in bestimmten Funktionen festzulegen oder einige Daten im Debugger zu untersuchen, und Sie können sie in unerwartete Funktionen bringen, wenn Sie ihren Code einzeln durchlaufen. Das Verhalten des Codes ist identisch, aber die Debuggerpräsentation kann sehr verwirrend sein. Daher wird nicht empfohlen, "/OPT:ICF" in Debugbuilds zu verwenden, es sei denn, die Vorteile von kleinerem Code überwiegen diese Nachteile.
Hinweis
Da /OPT:ICF dazu führen kann, dass dieselbe Adresse verschiedenen Funktionen oder schreibgeschützten Datenmembern zugewiesen wird (d. h. Variablen, die mithilfe von /Gy kompiliert werden), kann ein Programm, das von eindeutigen Adressen für Funktionen oder schreibgeschützte Datenmember abhängt, const
unterbrechen. Weitere Informationen finden Sie unter /Gy (Funktionslevel-Linking aktivieren).
LBR NOLBR |
Die Optionen /OPT:LBR und /OPT:NOLBR gelten nur für ARM-Binärdateien. Da bestimmte ARM-Prozessorverzweigungsanweisungen einen begrenzten Bereich aufweisen, wenn der Linker einen Sprung zu einer Out-of-Range-Adresse erkennt, ersetzt er die Zieladresse der Verzweigungsanweisung durch die Adresse eines Codes "Insel", die eine Verzweigungsanweisung enthält, die auf das tatsächliche Ziel ausgerichtet ist. Sie können /OPT:LBR verwenden, um die Erkennung langer Verzweigungsanweisungen und die Platzierung von Zwischencodeinseln zu optimieren, um die Gesamtcodegröße zu minimieren. /OPT:NOLBR weist den Linker an, Codeinseln für lange Verzweigungsanweisungen ohne Optimierung zu generieren.
Standardmäßig wird die Option "/OPT:LBR " festgelegt, wenn die inkrementelle Verknüpfung nicht aktiviert ist. Wenn Sie eine nicht inkrementelle Verknüpfung, aber keine Optimierungen für lange Verzweigungen wünschen, geben Sie /OPT:NOLBR an. Die Option "/OPT:LBR " deaktiviert die inkrementelle Verknüpfung.
Hinweise
Bei Verwendung in der Befehlszeile wird der Linker standardmäßig auf /OPT:REF,ICF,LBR festgelegt. Wenn /DEBUG angegeben ist, lautet der Standardwert /OPT:NOREF,NOICF,NOLBR.
Die /OPT-Optimierungen verringern im Allgemeinen die Bildgröße und erhöhen die Programmgeschwindigkeit. Diese Verbesserungen können in größeren Programmen erheblich sein, weshalb sie standardmäßig für Einzelhandelsbuilds aktiviert sind.
Die Linkeroptimierung nimmt im Vorfeld zusätzliche Zeit in Anspruch, aber der optimierte Code spart auch Zeit, wenn der Linker weniger Verlagerungen hat, um ein kleineres endgültiges Bild zu beheben und ein kleineres endgültiges Bild zu erstellen, und es spart noch mehr Zeit, wenn weniger Debuginformationen zum Verarbeiten und Schreiben in den PDB vorhanden sind. Wenn die Optimierung aktiviert ist, kann dies insgesamt zu einer schnelleren Linkzeit führen, da die geringen zusätzlichen Kosten in der Analyse möglicherweise mehr als durch die Zeitersparnis im Linker über kleinere Binärdateien übersteigen.
Die /OPT-Argumente können durch Kommas getrennt angegeben werden. Anstelle von /OPT:REF /OPT:NOICF können Sie z. B. /OPT:REF,NOICF angeben.
Sie können die Option "/VERBOSE linker" verwenden, um die Funktionen anzuzeigen, die von /OPT:REF entfernt werden, und die Funktionen, die von /OPT:ICF gefaltet werden.
Die /OPT-Argumente werden häufig für Projekte festgelegt, die mithilfe des Dialogfelds "Neues Projekt " in der Visual Studio-IDE erstellt wurden und in der Regel unterschiedliche Werte für Debug- und Releasekonfigurationen aufweisen. Wenn für diese Linkeroptionen in Ihrem Projekt kein Wert festgelegt ist, erhalten Sie möglicherweise die Projektstandardwerte, die sich von den Standardwerten unterscheiden können, die vom Linker in der Befehlszeile verwendet werden.
So legen Sie die OPT:ICF- oder OPT:REF-Linkeroption in der Visual Studio-Entwicklungsumgebung fest
Öffnen Sie das Dialogfeld Eigenschaftenseiten des Projekts. Weitere Informationen erhalten Sie unter Set C++ compiler and build properties in Visual Studio (Festlegen der Compiler- und Buildeigenschaften (C++) in Visual Studio).
Wählen Sie die Eigenschaftenseite "Konfigurationseigenschaftenoptimierung>>" aus.
Ändern Sie eine der folgenden Eigenschaften:
COMDAT-Faltung aktivieren
Informationsquellen
So legen Sie die OPT:LBR-Linkeroption in der Visual Studio-Entwicklungsumgebung fest
Öffnen Sie das Dialogfeld Eigenschaftenseiten des Projekts. Weitere Informationen erhalten Sie unter Set C++ compiler and build properties in Visual Studio (Festlegen der Compiler- und Buildeigenschaften (C++) in Visual Studio).
Klicken Sie auf der Eigenschaftenseite auf Konfigurationseigenschaften>Linker>Befehlszeile.
Geben Sie die Option in "Zusätzliche Optionen" ein:
/opt:lbr
oder/opt:nolbr
So legen Sie diese Linkeroption programmgesteuert fest
- Siehe die Eigenschaften EnableCOMDATFolding und OptimizeReferences.