Verständnis der C ++ Funktion Inlining

9

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.

  •   
  • Die Funktion verwendet Inline-Assembly, sofern sie nicht mit /Og , /Ox , /O1 oder /O2 .

  • kompiliert wurde   
  • 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 Sie inline_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

%Vor%

wo wie ohne den Destruktor INLINE ~Spam() {} haben wir die folgende Demontage

%Vor%

Ich verstehe nicht, warum der Compiler bei Vorhandensein des Destruktors die Funktion T movz(T& t)

nicht einfügt
  • Hinweis Das Verhalten ist von 2008 bis 2013 konsistent
  • Hinweis Ich habe das mit cygwin-gcc überprüft, aber der Compiler inline den Code. Ich kann andere Compiler zu diesem Zeitpunkt nicht überprüfen, würde aber in den nächsten 12 Stunden aktualisieren, falls erforderlich
Abhijit 11.09.2014, 20:03
quelle

1 Antwort

1

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.

    
Robin Hsu 19.09.2014 11:59
quelle

Tags und Links