2009-04-15 5 views
6

Wie ich es verstehe, sind alle Memberfunktionen in D virtuell, aber der Compiler ist frei, Funktionen nicht-virtuell zu machen, wenn er sieht, dass sie niemals überschrieben werden.Gibt es eine Möglichkeit, sicherzustellen, dass Mitgliedsfunktionen in D virtuell sind?

Was ich nicht weiß ist, was passiert, wenn Sie ein Modul kompilieren, in dem Elementfunktionen nicht überschrieben werden und das Modul dann woanders importieren, wo Sie eine Elementfunktion überschreiben. Ich glaube nicht, dass es das ursprüngliche Modul neu kompiliert. Geht es einfach davon aus, dass irgendeine Mitgliedsfunktion mit externer Verknüpfung virtuell ist?

Antwort

5

Alle D-Elementfunktionen sind standardmäßig virtuell. Ich denke nicht, dass es Compiler gibt, die Funktionen als Optimierung virtuell machen. Sie können dies jedoch manuell tun, indem Sie die Klasse oder die Funktion als "final" markieren.

1

Ich glaube, FeepingCreature ist korrekt, aber ich denke auch, Sie können davon ausgehen, dass solche Optimierungen nur vom Compiler berücksichtigt werden, wenn es direkt eine ausführbare Datei aus den Quellen erstellt.

2

FeepingCreature ist größtenteils korrekt, außer für Vorlagenfunktionen, die nicht virtuell gemacht werden können.

2

Wie dies implementiert wird, ist Compiler- und Linker-spezifisch. Eine häufige Situation, in der virtuelle Funktionsaufrufe jedoch weg optimiert werden können, ist die lokale Instanziierung einer Klasse. Dann können Funktionsaufrufe direkt innerhalb dieses Bereichs ausgeführt werden, da der Typ der Klasse zur Kompilierungszeit vollständig bekannt ist. Dies kann auf einer Compiler-Ebene erfolgen.

Wenn der Linker außerdem realisiert, dass die Funktionsimplementierung niemals überschrieben wird, kann der Linker die Optimierung durchführen und virtuelle Funktionsaufrufe durch direkte Funktionsaufrufe für diese Klasse ersetzen. Insbesondere, wenn eine Klasse niemals abgeleitet wird, können alle Aufrufe von Elementfunktionen direkt ausgeführt werden. Es ist so, als würde der Linker das "endgültige" Keyword einfügen, wo immer es möglich ist. (Der Linker kann diese Optimierung nicht auf exportierte Klassen und Funktionen anwenden, da der Linker nicht weiß, ob Funktionen in anderen Bibliotheken oder ausführbaren Dateien überschrieben werden.)

Verwandte Themen