Ich verwende ein MS-spezifisches Schlüsselwort, um zu erzwingen, dass eine globale Funktion inline ist, aber mir ist aufgefallen, dass die Funktion nicht inline ist, wenn sie ein Objekt verwendet, das einen expliziten trivialen Destruktor hat.
Zitieren von MSDN
Selbst mit
__forceinline
kann der Compiler keinen Inline-Code in allen Compilern erstellen Umstände. Der Compiler kann keine Funktion inline einfügen, wenn:
Die Funktion oder ihr Aufrufer wird mit
/Ob0
kompiliert (die Standardoption für Debug-Builds).Die Funktion und der Aufrufer verwenden verschiedene Arten der Ausnahmebehandlung (C ++ - Ausnahmebehandlung in einer strukturierten Ausnahmebehandlung in der anderen).
Die Funktion hat eine variable Argumentliste.
- kompiliert wurde
Die Funktion verwendet Inline-Assembly, sofern sie nicht mit
/Og
,/Ox
,/O1
oder/O2
.Die Funktion ist rekursiv und wird nicht von
#pragma inline_recursion(on)
begleitet. Mit dem Pragma werden rekursive Funktionen auf eine voreingestellte Tiefe von 16 Aufrufen eingestellt. Um die Inline-Tiefe zu reduzieren, verwenden Sieinline_depth
pragma.Die Funktion ist virtuell und wird virtuell aufgerufen. Direkte Aufrufe an virtuelle Funktionen können eingebunden werden.
Das Programm übernimmt die Adresse der Funktion und der Aufruf erfolgt über den Zeiger auf die Funktion. Direkte Aufrufe von Funktionen, deren Adresse übernommen wurde, können inline eingegeben werden.
Die Funktion ist auch mit dem nackten% -Modifizierer
__declspec
gekennzeichnet.
Ich versuche das folgende eigenständige Programm, um das Verhalten zu testen
%Vor% Mit dem trivialen Destruktor INLINE ~Spam() {}
an der richtigen Stelle haben wir die folgende Zerlegung
wo wie ohne den Destruktor INLINE ~Spam() {}
haben wir die folgende Demontage
Ich verstehe nicht, warum der Compiler bei Vorhandensein des Destruktors die Funktion T movz(T& t)
Ja, es ist ein Fehler. Ich habe es auf Qt über MinGW Compiler-Umgebung getestet. Es optimiert alles sehr gut.
Zuerst habe ich Ihren Code ein wenig wie unten geändert, um den Assembler-Code leichter zu sehen:
%Vor%Und von meiner Qt Debugdemontage:
%Vor%Sie können sogar sehen, dass foo () optimiert ist. Sie können sehen, dass die Variable 'i' direkt 5 zugeordnet ist und gedruckt wird.
Tags und Links c++ visual-c++ inlining