Question

C ++ a héritage multiple. La mise en œuvre de l'héritage multiple au niveau de l'assemblage peut être assez compliqué, mais il y a de bonnes descriptions de rel="noreferrer"> en ligne sur comment se fait normalement (ce vtables, fixups pointeur, thunks, etc.).

Java ne possède pas l'héritage multiple de mise en œuvre, mais il a l'héritage d'interface multiple, donc je ne pense pas mise en œuvre avant droit avec une seule vtable par classe peut mettre en oeuvre. Comment fonctionne java implémenter des interfaces en interne?

Je me rends compte que, contrairement à C ++, Java est compilé Jit, si différents morceaux de code peuvent être optimisés différemment et différents JVMs pourraient faire les choses différemment. Alors, est-il une stratégie générale que beaucoup JVMs suivent à ce sujet, ou personne ne sait la mise en œuvre dans une machine virtuelle Java spécifique?

En outre JVMs devirtualize souvent et les appels de méthode en ligne dans ce cas, il n'y a pas vtables ou équivalent impliqué du tout, il pourrait ne pas judicieux de poser des questions sur des séquences d'assemblage réelles qui mettent en œuvre des appels de méthode d'interface / virtuels, mais je suppose que la plupart JVMs toujours garder une sorte de représentation générale des classes autour d'utiliser si elles n'ont pas été en mesure de devirtualize tout. Est-ce mal d'hypothèse? Est-ce que ce regard de la représentation de quelque façon comme un C ++ vtable? Si oui ne interfaces ont vtables séparées et comment sont-elles liées à vtables de classe? Si oui peut opposer les instances ont plusieurs pointeurs vtable (classe / vtables d'interface) comme des instances d'objet dans la boîte de C? Est-ce que les références d'un type de classe et un type d'interface au même objet ont toujours la même valeur binaire ou peuvent différer comme ceux-ci en C ++, où ils ont besoin fixups pointeur?

(pour référence: cette question demande quelque chose de similaire sur le CLR, et il semble y avoir une bonne explication dans cet article msdn bien que peut être obsolète maintenant. Je n'ai pas pu trouver quelque chose de similaire pour Java.)

Modifier

  • Je veux dire « outils » au sens de « Comment le compilateur GCC entier mettre en œuvre des appels d'addition / fonction / etc », pas dans le sens de « classe Java ArrayList met en œuvre l'interface List ».
  • Je suis au courant de la façon dont fonctionne ce au niveau de bytecode JVM, ce que je veux savoir est quel genre de code et datastructures sont générés par la machine virtuelle Java après le chargement est fait le fichiers de classe et la compilation du bytecode.
Était-ce utile?

La solution

La principale caractéristique de la machine virtuelle Java HotSpot est mise en cache en ligne . Cela ne signifie pas réellement que la méthode cible est inline, mais signifie que l'hypothèse est mis dans le code JIT que chaque appel futur à la méthode virtuelle ou interface cible la même mise en œuvre (à savoir que le site d'appel est monomorphe). Dans ce cas, un chèque est compilé dans le code de la machine si l'hypothèse est en fait (à savoir si le type de l'objet cible est la même que la dernière fois), puis commande de transfert directement à la méthode cible - sans tables virtuelles impliquées du tout. Si l'assertion échoue, une tentative peut être faite pour convertir à un site d'appel megamorphic (à savoir avec plusieurs types possibles); si cela échoue également (ou si elle est la première communication), on effectue une recherche régulière de longue haleine, en utilisant des méthodes vtables (virtuelles) et itables (pour les interfaces).

Modifier : Hotspot Wiki a plus de détails sur les talons vtable et Itableau. Dans le cas polymorphes, il met encore une version de cache en ligne dans le site d'appel. Cependant, le code est en fait un stub qui effectue une recherche dans un vtable, ou un Itableau. Il y a un talon vtable pour chaque décalage vtable (0, 1, 2, ...). Interface appelle ajouter une recherche linéaire sur un tableau de itables avant de regarder dans le Itableau (si trouvé) à la position donnée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top