Wenn mindestens eine virtuelle Methode in einer C ++ - Klasse (oder einer ihrer übergeordneten Klassen) vorhanden ist, verfügt die Klasse über eine virtuelle Tabelle und jede Instanz über einen virtuellen Zeiger.
Die Speicherkosten sind also ziemlich klar. Am wichtigsten sind die Speicherkosten für die Instanzen (insbesondere wenn die Instanzen klein sind, z. B. wenn sie nur eine Ganzzahl enthalten sollen: In diesem Fall kann ein virtueller Zeiger in jeder Instanz die Größe der Instanzen verdoppeln Der von den virtuellen Tabellen belegte Speicherplatz ist im Vergleich zum vom eigentlichen Methodencode belegten Speicherplatz normalerweise vernachlässigbar.
Dies bringt mich zu meiner Frage: Gibt es messbare Leistungskosten (dh Geschwindigkeitsauswirkungen), um eine Methode virtuell zu machen? Bei jedem Methodenaufruf wird zur Laufzeit eine Suche in der virtuellen Tabelle durchgeführt. Wenn diese Methode also sehr häufig aufgerufen wird und diese Methode sehr kurz ist, kann es zu einem messbaren Leistungseinbruch kommen. Ich denke, es hängt von der Plattform ab, aber hat jemand einige Benchmarks durchgeführt?
Der Grund, den ich frage, ist, dass ich auf einen Fehler gestoßen bin, der zufällig darauf zurückzuführen ist, dass ein Programmierer vergessen hat, eine virtuelle Methode zu definieren. Dies ist nicht das erste Mal, dass ich einen solchen Fehler sehe. Und ich dachte: warum wir fügen die virtuelle Schlüsselwort bei Bedarf statt Entfernen des virtuellen Schlüsselwort , wenn wir absolut sicher sind , dass es nicht notwendig? Wenn die Leistungskosten niedrig sind, empfehle ich in meinem Team einfach Folgendes: Machen Sie einfach jede Methode standardmäßig virtuell, einschließlich des Destruktors, in jeder Klasse und entfernen Sie sie nur, wenn Sie dies benötigen. Klingt das für dich verrückt?