2016-08-14 1 views
0

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?

+0

Sicher ly das ist Compiler abhängig –

+0

Dies ist implementationsabhängig, aber ich bin fast sicher, dass alle vernünftige Compiler tatsächlich diese Optimierung tun. – lisyarus

+0

"Es gibt keine erbenden Klassen" Dies kann fast nie verifiziert werden. –

Antwort

0

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.

Verwandte Themen