Zum Beispiel, wenn Foo()
eine virtuelle Methode der Klasse Bar
ist, gibt es keine erbenden Klassen, und der Compiler konnte zur Kompilierzeit ableiten, dass der Typ Bar
ist (zB Bar.Foo()
). Da es zur Kompilierungszeit klar ist, dass Bar::Foo()
die einzige mögliche Methode ist, zu der der Aufruf aufgelöst werden könnte, optimieren Compiler im Allgemeinen die Suche nach virtuellen Methoden?Gibt es Fälle, in denen ein virtueller Methodenaufruf optimiert ist?
Antwort
Ja, in einem solchen Fall Bar.Foo()
Anruf wird optimiert werden. Here ist die Erklärung dafür, wie ein solcher Aufruf von einem GCC-Compiler eingezeichnet wird.
Die ganze Reihe von Artikeln von GCC Entwickler Honza Hubička beschreibt, wie devirtualization
auf niedrigem Niveau umgesetzt wird und welche Grenzen hat:
Die Compiler-Optimierung zum Entfernen virtueller Aufrufe heißt devirtualisation
. Es erfordert, dass der Compiler den genauen Typ der Instanz kennt, um zu wissen, dass eine bestimmte Überladung aufgerufen wird.
In der Annahme, dass Sie solche Klassen haben, würde ich empfehlen, final
wo sinnvoll zu verwenden, um anzugeben, dass keine Klasse davon erben kann, oder keine erbende Klasse kann diese bestimmte Methode überschreiben.
Alles hängt von Ihrem Compiler ab, obwohl es in gewisser Weise bereits verwendet wird.
Ein großer Haken bei dieser Optimierung ist, dass der Compiler den genauen Typ kennen muss und daraus folgern kann, dass keine Klassen von ihm erben oder den Methodenaufruf überschreiben können. Wenn die Klasse eine verborgene Sichtbarkeit hat, könnte LTO herausfinden, dass eine Methode nur einmal implementiert wird, aber ich habe noch keine Implementierung davon gesehen.
- 1. Gibt es Fälle, in denen es falsch ist, push_back durch emplace_back zu ersetzen?
- 2. Gibt es Fälle, in denen es besser ist Sigmoid Aktivierung über ReLu
- 3. Gibt es Fälle, in denen ein "finally" -Konstrukt in C++ nützlich wäre?
- 4. Gibt es bestimmte Fälle, in denen eine native Textbearbeitung wünschenswerter ist als Regex?
- 5. Gibt es Fälle, in denen setTimeout (.., 0) besser ist als requestAnimationFrame()?
- 6. Fälle, in denen float == und! = Keine direkten Gegensätze sind
- 7. Gibt es Fälle, in denen der Destruktor in PHP NICHT aufgerufen wird?
- 8. Gibt es Fälle, in denen die Syntax des schleppenden Rückgabetyps in Lambda nicht vermieden werden kann?
- 9. Gibt es Fälle, in denen Python-Threads den gemeinsamen Status sicher manipulieren können?
- 10. Gibt es Fälle, in denen Application.Exit() das FormClosing-Ereignis nicht auslöst?
- 11. Gibt es Fälle, in denen eine 32-Bit-Variable nicht richtig ausgerichtet werden konnte
- 12. Wann ist ein parametrisierter Methodenaufruf sinnvoll?
- 13. Gibt es Szenarien, in denen Mehrfachvererbung erforderlich ist?
- 14. Liste der Fälle, in denen USING-Anweisung verwendet werden sollte
- 15. GHC Overlapping Fälle, in denen zusätzlich zu verallgemeinern
- 16. Virtueller Destruktor - wenn es notwendig ist
- 17. Warum ist ein AutoSuggestBox-Text nicht "optimiert"?
- 18. Wie erkennt man, ob ein Ausdruck 'Methodenaufruf' ist?
- 19. Flushing ein virtueller Adressbereich
- 20. Gibt es in C Subroutinen ähnlich denen in Fortran?
- 21. Rekursion verwenden, um Fälle zu finden, in denen die Summe gleich ist
- 22. getClass() in abstrakten Klasse gibt Ambiguous Methodenaufruf
- 23. Ist es möglich, Methodenaufruf-Dispatcher in C++ zu erstellen?
- 24. Ist es in Ordnung, den asynchronen Methodenaufruf nicht abzuwarten?
- 25. Ablaufen ein Methodenaufruf
- 26. Welche davon ist optimiert?
- 27. Gibt es ein Formularübermittlungsmuster?
- 28. Ist es möglich, alle Zellen auszuwählen, in denen ein bedingtes Format wahr ist?
- 29. Gibt es Szenarien, in denen C4172 Visual C++ - Warnung nicht als Fehler betrachtet werden sollte?
- 30. gcc -OO optimiert immer noch "unbenutzten" Code. Gibt es ein Compile-Flag, um das zu ändern?
Sicher ly das ist Compiler abhängig –
Dies ist implementationsabhängig, aber ich bin fast sicher, dass alle vernünftige Compiler tatsächlich diese Optimierung tun. – lisyarus
"Es gibt keine erbenden Klassen" Dies kann fast nie verifiziert werden. –