Pour une implémentation raisonnable de Java :
Chaque objet possède un en-tête contenant, entre autres choses, un pointeur vers le type d'exécution (par exemple Double
ou String
, mais cela ne pourrait jamais être CharSequence
ou AbstractList
). En supposant que le compilateur d'exécution (généralement HotSpot dans le cas de Sun) ne peut pas déterminer le type statiquement, quelques vérifications doivent être effectuées par le code machine généré.
Tout d'abord, ce pointeur vers le type d'exécution doit être lu. Ceci est nécessaire pour appeler une méthode virtuelle dans une situation similaire de toute façon.
Pour convertir vers un type de classe, il est exactement connu combien de superclasses il y a jusqu'à ce que vous atteigniez java.lang.Object
, donc le type peut être lu à un décalage constant à partir du pointeur du type (en fait les huit premiers dans HotSpot). Encore une fois, cela est analogue à la lecture d'un pointeur de méthode pour une méthode virtuelle.
Ensuite, la valeur lue doit simplement être comparée au type statique attendu de la conversion. Selon l'architecture du jeu d'instructions, une autre instruction devra effectuer une branche (ou une erreur) sur une mauvaise branche. Les jeux d'instructions tels que l'ARM 32 bits ont des instructions conditionnelles et peuvent peut-être permettre à la voie triste de passer par la voie joyeuse.
Les interfaces sont plus difficiles en raison de l'héritage multiple des interfaces. Généralement, les deux dernières conversions vers des interfaces sont mises en cache dans le type d'exécution. Dans les tout premiers jours (il y a plus d'une décennie), les interfaces étaient un peu lentes, mais ce n'est plus pertinent.
En espérant que vous puissiez voir que ce genre de chose est largement sans importance pour les performances. Votre code source est plus important. En termes de performances, le plus grand impact dans votre scénario est susceptible d'être les erreurs de cache en suivant les pointeurs d'objet à plusieurs endroits (les informations de type seront bien sûr communes).