Interface Tabelle: Redundanter Verweis auf den Klassen-Interface-V-Table

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Interface Tabelle: Redundanter Verweis auf den Klassen-Interface-V-Table
z.B. in der Vorlesungsfolie 10/29 aus Vorlesung 9 ist in der “Interface-Tabelle A” zusaetzlich zum Offset (16) und dem Pointer zum Interface Deskriptor (I) noch ein Verweis auf die Interface-V-Table (I) gespeichert.

Dieser wird aber weder beim Cast vom Interface Typ noch beim Methodenaufruf auf’s Interface-Objekt verwendet. Auch kann er mit dem Interface-this-Pointer und dem dadurch bekannten Offset leicht rekonstruiert werden.

Handelt es sich hier um eine Optimierung die einfach aus dem javac uebernommen wurde (und fuer uns keine Rolle spielt) oder gibt es einen fuer die Vorlesung relevanten Grund in der Interface-Tablle mehr als nur die Offsets und die Interface-Pointer zu speichern?


Die Frage ist doch: Wo kommt der Zeiger auf die Interface-V-Table ursprünglich her? Wenn wir ein Objekt erzeugen wollen, können wir natürlich für jede Klasse einen eigenen Konstruktor basteln, der eigens den Klassendeskriptor und die Interface-V-Tables an den entsprechenden Positionen einträgt. Damit haben wir diese Instruktionen in den Konstruktoren jeder einzelnen Klasse stehen. Kommen wir nun auf die Idee, dass wir etwas am Layout ändern wollen (ohne dabei die Feld-Offsets und V-Table-Offsets zu verändern), müssen Nutzer ihren gesamten Code rekompilieren – Rückwärtskompatibilität ist dahin! Daher ist es besser, wenn wir den Code zum Eintragen der Klassendeskriptoren und Interface-V-Tables nur an einer Stelle haben. Tatsächlich können wir leicht eine Funktion schreiben, die einen Klassendeskriptor nimmt und mit dessen Hilfe genügend Speicher alloziert und sogleich Klassendeskriptor und Interface-V-Tables einträgt. Dazu muss der Klassendeskriptor aber die Interface-V-Tables referenzieren, denn sonst wissen wir nicht, was wir wo eintragen sollen.

Nitpick: Der javac generiert keine V-Tables, sondern identifiziert Methoden noch über einen (quasi-)eindeutigen Namen. :wink:
In gewisser Weise ist es aber eine Art der Optimierung, ja.

1 „Gefällt mir“