Pourquoi un garbage collector et pas du reference counting, avec suppression immédiate ou retardée ? En gros: tu notes tous les objets dont tu sais que tu n'auras plus besoin, et 2 secondes plus tard, tu fais le grand nettoyage. C'est pratique lorsque tu as besoin d'effacer un objet, mais que tu sais qu'il y en a 2 ou 3 autres qui l'ont encore dans leurs dépendances.
Sinon, pour les fonctions virtuelles, ça dépend des environnements bien sûr. Mais en gros:
Chaque objet a un "champ" supplémentaire qui est le pointeur vers sa VTable. Cela permet d'effectuer toute sorte de manip sur la RTTI, et cela permet surtout de connaître l'addresse des fonctions virtuelles.
Il n'y a qu'une VTable en mémoire par classe. Et cette VTable n'est rien d'autre qu'un tableau de pointeurs sur fonctions membres.
Un compilo en 32 bits peut du coup implémenter un appel en:
load registre1, adress_vTable
jump [registre1+function_index_in_vTable*4] |
Il y a donc un déréférencement en plus par rapport à une fonction normale. Certaines archis ont d'ailleurs des instructions spécialisées pour faire ça (ça simplifie le code, mais ça n'enlève pas le double-accès mémoire...).