Comment les méthodes dynamiques sont-elles compilées via une table d'adressage (vtable) ?
Comprendre le mécanisme de compilation des méthodes dynamiques via la vtable et la représentation en mémoire des objets.
Comprendre le mécanisme de compilation des méthodes dynamiques via la vtable et la représentation en mémoire des objets.
Chaque classe possède une vtable (table d'adressage) associant un numéro à l'adresse du code de chaque méthode ; chaque objet en mémoire commence par un mot pointant vers la vtable de sa classe principale, permettant à la JVM de trouver le bon code lors de chaque appel.
num(Classe, m)), et la vtable stocke les adresses de leurs codes.objet.m(), la JVM lit le premier mot de l'objet (adresse de la vtable), puis récupère l'adresse du code de m à l'offset num(Classe, m).Décrire la vtable de Point (méthodes s() et d()) et la représentation en mémoire d'une instance.
num(Classe, m)), et la vtable stocke les adresses de leurs codes.Point a deux méthodes numérotées 0 et 1.
class Point {
int x, y;
int s() { return x + y; }
int d() { return x*x + y*y; }
}
// num(Point, s) = 0
// num(Point, d) = 1
// vtable Point = [ adr(Point,s), adr(Point,d) ]
Chaque objet Point en mémoire = 3 mots : [ptr_vtable | x | y].
Point p = new Point();
p.x = 13; p.y = 17;
// En mémoire :
// mot 0 : ptr vers vtable de Point
// mot 1 : valeur de x (13)
// mot 2 : valeur de y (17)
objet.m(), la JVM lit le premier mot de l'objet (adresse de la vtable), puis récupère l'adresse du code de m à l'offset num(Classe, m).Lors de p.s() : la JVM lit mot 0 (vtable), accède à offset 0 (adresse de s()), puis exécute.
// Pseudocode du mécanisme :
// 1. Lire p.mot[0] → adresse de la vtable de Point
// 2. Lire vtable[num(Point,s)] = vtable[0] → adr(Point,s)
// 3. Exécuter le code en adr(Point,s) avec this = p
System.out.println(p.s()); // 30 = 13+17
La vtable de Point contient [adr(s), adr(d)] ; chaque objet Point pointe vers cette vtable via son premier mot.
Comparer les vtables de Point et de ColorPoint extends Point (qui redéfinit d() et ajoute color()).
Expliquer pourquoi Java interdit l'héritage multiple à travers le problème des vtables qui se chevaucheraient.
Crée ton compte gratuit pour accéder à la fiche et aux exercices