Dans ce réponse à " en C++ pourquoi et comment les fonctions virtuelles sont-elles plus lentes? ", l'auteur mentionne le point ci-dessous:
"Obtenez la bonne adresse de fonction de la table virtuelle dans un registre (l'index où l'adresse de fonction correcte est stockée est décidé au moment de la compilation)."
Pour faire suite à ce commentaire, j'ai quelques questions:
Quel est l'ordre des pointeurs de fonction stockés dans le vtable
? Est-il dépendant du compilateur ou tous les compilateurs doivent-ils l'implémenter de la même manière?
Si les compilateurs sont libres de l'implémenter à leur manière, alors comment fonctionne le standard binaire comme COM
. COM
repose sur l'hypothèse que vtables
est implémenté de manière uniforme par les compilateurs, afin de passer IUnknown
pointeurs vers un composant compilé par un compilateur différent. N'est-ce pas?
Bien que cela dépende de la mise en œuvre, il est également assez prévisible. D'un point de vue historique, les compilateurs présentent les membres dans l'ordre de déclaration. Pour les champs (données d'instance), cela signifie que chaque champ reçoit le prochain décalage de l'objet (après que l'alignement a été arrondi selon les besoins) et que chaque méthode virtuelle introduite est affectée au prochain emplacement de table. (Les remplacements partagent le même emplacement de table virtuelle que la méthode virtuelle qu'ils remplacent dans la classe de base.)
L'héritage multiple complique les dispositions de champ et de table, introduisant une notion de sections qui regroupent les entrées de champ et de table, et le code généré doit basculer entre les sections selon leurs besoins d'utilisation.
Parce que, entre autres, C est la norme par défaut pour les appels de fonctions étrangères, de nombreux outils et programmes s'appuient sur C pour structurer les structures dans l'ordre prévisible qu'ils ont toujours fait.
De nos jours, les compilateurs C++ ont une certaine latitude pour certaines constructions, mais comme vous l'avez décrit, pour être utilisés avec COM (qui est bien sûr une norme Microsoft, pas une norme de langage C++), ils doivent également être prévisibles.
Voir également:
https://stackoverflow.com/questions/9115020/order-of-fields-in-c-c-structs
Tout dépend de la mise en œuvre. Il n'est pas nécessaire que les fonctions virtuelles soient implémentées par une table virtuelle par classe, une table virtuelle par objet ou tout autre mécanisme.
Une implémentation peut choisir pour être compatible avec une disposition d'objet particulière et une convention d'appel, (par exemple COM), mais ce n'est pas obligatoire to.