Il existe de nombreuses ressources en ligne sur VTABLES. Ils ont généralement la même déclaration en ce qui concerne: P>
" Chaque fois qu'une classe elle-même contient des fonctions virtuelles ou remplace les fonctions virtuelles à partir d'une classe mère, le compilateur construit un circule pour cette classe. Cela signifie que toutes les classes ne disposent pas d'une circule créée par le compilateur. strong> La machine à outils contient des pointeurs de fonction qui pointent sur les fonctions virtuelles de cette classe. Il ne peut y avoir qu'une table de table par classe, et tous les objets de la même classe partageront la même chose de table. em> " p>"
Alors pourquoi cela signifie-t-il exactement que toutes les classes ne disposent pas d'une table à table créée par le compilateur? Est-ce parce que les classes somc n'ont pas de fonctions virtuelles? P>
3 Réponses :
précisément. Certaines classes n'ont pas de table équitable car elles n'ont pas de méthodes virtuelles.
Les méthodes virtuelles sont des méthodes pour lesquelles votre compilateur ne peut pas générer d'appel direct car il varie en fonction de la mise en œuvre de la classe. Les ordinateurs virtuels sont une sorte de table de recherche qui résolvent ce problème en retardant la décision de laquelle la mise en œuvre appelle pendant la période d'exécution de votre programme: Au lieu de générer un appel de fonction, votre compilateur génère une recherche de méthode sur la machine à installer, puis appelle la méthode retournée. . P>
Prenez cet exemple: p> Ceci imprimera le message code> de la barre de code>. Dans la plupart des scénarios non triviaux, votre compilateur ne peut pas savoir à l'avance le type de l'objet sur lequel une méthode virtuelle est appelée. Comme mentionné ci-dessus, la machine à installer résout le problème en fournissant un mécanisme de recherche uniforme pour trouver des implémentations de méthode, quel que soit le type d'objet. P> Un pointeur à fourble doit exister dans chaque cas d'une classe (ce qui nécessite la La taille d'un pointeur de mémoire supplémentaire, susceptible d'être 4 ou 8 octets) et une quantité insignifiante de mémoire statique quelque part dans l'espace d'adressage de votre programme. Cela peut ne pas sembler beaucoup à vous (et bien de nombreuses personnes d'accord), mais cela peut être lourde dans certains scénarios (comme des systèmes embarqués où la mémoire est extrêmement em> limitée). Avoir des vtables pour chaque classe enfreindrait le principe général C ++ que vous ne payez que pour ce que vous utilisez et que le compilateur ne génère aucun disque de table si cela n'a pas besoin. P> Ne pas avoir une tablette L'effet secondaire notable de la désactivation
En réalité, rien dans C ++ ne nécessite que toute classe ait une circonscription - elle est entièrement une question de mise en œuvre. Cependant, une classe avec des fonctions virtuelles doit en quelque sorte prendre en charge les appels de fonction polymorphes, ce qui nécessitera toujours une table / carte de quelque sorte. Cette table / carte sera créée par le compilateur pour les classes contenant des fonctions polymorphes et pourrait (en fonction de la qualité du compilateur) pour celles qui ne le font pas. p>
Connaissez-vous un seul compilateur C ++ jamais i>, quel que soit la qualité de la qualité, qui crée des vtables (ou de toute analogue de celui-ci) pour les classes sans fonctions polymorphes?
Je ne le fais pas, et il y a une bonne raison pour que: Pour mettre en œuvre externe "C" code>, un compilateur C ++ doit déjà prendre en charge les étables sans vtales. Pourrait aussi bien être efficace et créer des ordinateurs virtuels uniquement en cas de besoin.
En outre, certaines classes n'ont pas de table de table car il est explicitement supprimé, voir __ DeclSpec (novable) code>
(compilateur spécifique) p>