Überschriebene virtuelle Funktion: virtuell oder nicht?



  • zeusosc schrieb:

    Virtuellen Klassen

    Polymorphen Klassen



  • Kurze Ergänzung: Die "virtuelle Tabelle" nennen AFAIK die meisten Compiler vtable , die fachsprachliche Abkürzung ist VMT (VirtualMethodTable). Einige Compiler liefern Fehler wie

    undefined reference to `vtable for VintagePort'



  • Japp und Japp 🙂



  • Hoffentlich gibts im neuen C++ Standard eine Möglichkeit nur Entpolymorphisierung.



  • Du meinst, eine virtuelle Funktion in abgeleiteten Klassen nicht mehr virtuell zu machen? Falls ja, was sollte das bringen?



  • Weil nicht-polymorphistische Methoden schneller im Aufruf sind.



  • xcall schrieb:

    Weil nicht-polymorphistische Methoden schneller im Aufruf sind.

    Nicht, wenn du es deinem Compiler nicht explizit verbietest, schlau zu sein.

    Der gcc macht mir die virtuelle Funktion sogar inline, wenn er schnallt, dass kein late binding stattfindet. Das fand ich echt krass.



  • xcall schrieb:

    Weil nicht-polymorphistische Methoden schneller im Aufruf sind.

    Du kannst aber dennoch nicht einfach die Semantik ändern. Wenn die Funktion in der abgeleiteten Klasse nicht mehr virtuell wäre, aber über eine Basisklasse aufgerufen würde, was sollte dann passieren?

    Erkläre das Ganze bitte ausführlicher. Bisher macht es eher den Anschein, dass du ein total unnützes Feature verfechtest, nur weil dir Performance-Mythen Angst machen.



  • Nexus schrieb:

    xcall schrieb:

    Weil nicht-polymorphistische Methoden schneller im Aufruf sind.

    Du kannst aber dennoch nicht einfach die Semantik ändern. Wenn die Funktion in der abgeleiteten Klasse nicht mehr virtuell wäre, aber über eine Basisklasse aufgerufen würde, was sollte dann passieren?

    Erkläre das Ganze bitte ausführlicher. Bisher macht es eher den Anschein, dass du ein total unnützes Feature verfechtest, nur weil dir Performance-Mythen Angst machen.

    Ich denke, es ist so gemeint, wie ich es ursprünglich im Kopf hatte: Dass der virtuelle Aufruf nur stattfindet, wenn die Funktion in Klasse X des Pointers auf X noch virtuell ist, was dem Compiler als Optimierungshilfe dient. Es macht ja wenig Sinn, einen virtual function call durchzuführen, wenn bekannt ist, dass es keine überschreibung gibt.
    Ist allerdings fragwürdig, ob das allein ausreicht um so ein Feature einzuführen.



  • Cachus schrieb:

    Ist allerdings fragwürdig, ob das allein ausreicht um so ein Feature einzuführen.

    Da Compiler diese Optimierung schon heute ohne dieses "Feature" durchführen, wohl eher nicht.



  • Auch wenn ein Compiler nicht alle Fälle optimieren kann, ist es wenigstens möglich den virtuellen Aufruf zu unterdrücken ( derivedObject.Base::foo() ), womit die Idee der "Entpolymorphisierung" allerdings hinfällig währe.


Anmelden zum Antworten