Frage

Ich weiß, wie man die Auflösung des virtuellen Funktionsaufrufs implementiert, ist weder Teil von C ++-Standrads noch etwas über VPTR oder V-Table, aber lassen Sie mich diese Frage hier stellen.

Ich habe gehört, dass V-Tisch eine gemeinsame Technik ist, die von Compilern zur Implementierung der Auflösung der virtuellen Funktionsaufruf verwendet wird. Mein Unterstehen darüber ist, dass pro Klasse pro Prozess nur virtuelle Tabellen benötigt wird.

Ich frage mich, wann wird der V-Tisch für eine Klasse erstellt?
Ist es, wenn die Klasse eines bestimmten Typs (der ein V-Tisch benötigt) zum ersten Mal in einem Prozessraum erstellt wird?
Alle anderen anschließend erstellten Objekte dieses Typs in diesem Prozessraum beziehen sich auf die bereits erstellte V-Tisch?
Wann würde dieser V-Tisch gelöscht?

Es tut mir leid, wenn dies zu subjektiv ist oder eine Diskussionsfrage, aber diese Fragen bleiben eine Weile in meinem Kopf und ich fühle, dass es in Ordnung ist, sie hier zu fragen.

War es hilfreich?

Lösung

Der V-Tisch wird statisch zugewiesen und niemals gelöscht, noch wird sie explizit zugewiesen. Die Zeiger innerhalb eines bestimmten spezifischen Objekts sind Konstanten.

Andere Tipps

Das C ++ FAQ Bietet eine vereinfachte Erklärung des vtable Mechanismus. Sie sollten es lesen, obwohl Sie wahrscheinlich Ihre spezielle Compiler -Dokumentation für weitere Details durchgehen müssen.

Die wichtigsten Ideen aus meiner Sicht:

  • Das VTable für einen Typ ist statisch und zur Kompilierung gebaut
  • Jeder der Typinstanzen enthält a Zeiger zu diesem Tisch
  • Da dieser Zeiger zur Bauzeit initialisiert wird, sollte eine virtuelle Mitgliedsfunktion niemals vom Konstruktor aufgerufen werden

Das VTABLE sind statische Daten, die sofort bei der Last verfügbar sind. Übrigens wird es normalerweise in der Kompilierungseinheit gebündelt, die die Definition für die erste nicht-inline-virtuelle Funktion in der Klasse enthält (und dass Heuristik zu Problem führt, wenn es nur eine virtuelle Funktion gibt, die inline ist).

Ich glaube, es ist alles, was die Implementierung definiert ist, daher ist es schwierig, eine universelle Antwort auf diese Frage zu geben. Ich glaube, die VTABLE sollte eine Art statischer Klassenmitglied sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top