En langage assembleur, les objets sont stockés sous forme de blocs de mémoire contigus, de la même manière que les structures sont stockées. La disposition des membres d'un objet dépend de l'ordre dans lequel ils sont définis, les exigences d'alignement étant appliquées par l'ABI du système cible. Comme tout autre objet, une structure est un bloc d'octets qui peut être stocké, manipulé et copié en tant que « valeur » sans avoir besoin d'instructions d'assemblage spéciales.
Les fonctions membres, lorsqu'elles sont invoquées sur un objet, implicitement recevoir un pointeur vers cet objet comme premier argument. Ce pointeur, appelé pointeur « this », permet à la fonction d'accéder aux données membres de l'objet. Par exemple, dans x86-64 SysV ABI, le pointeur "this" est passé dans le registre rdi.
Les classes, comme les structures, sont stockées de manière contiguë en mémoire lorsque les fonctions membres virtuelles ne sont pas impliquées. Cependant, lorsque les classes contiennent des fonctions membres virtuelles, elles portent un pointeur supplémentaire appelé vtable ou table de méthodes virtuelles. Cette table virtuelle contient les adresses des implémentations de fonctions réelles pour chaque fonction virtuelle.
Lorsqu'une fonction virtuelle est invoquée, le compilateur génère du code pour charger le pointeur de table virtuelle approprié à partir de l'objet, puis utilise un saut indirect pour appeler le fonction correcte. Cela permet le polymorphisme et la possibilité d'étendre la fonctionnalité de la classe sans recompiler le code existant qui l'utilise.
Le compilateur peut optimiser les appels de fonctions virtuelles dans certains scénarios. S'il peut déterminer au moment de la compilation que le type d'objet sera toujours le même, il peut intégrer l'implémentation de fonction spécifique au lieu d'effectuer un saut indirect via la table virtuelle. Cette optimisation, connue sous le nom de dévirtualisation, améliore les performances en éliminant le besoin de saut indirect.
Bien que les objets soient généralement stockés en mémoire, les compilateurs peuvent optimiser certains idiomes pour éviter l’allocation de mémoire. Par exemple, si une petite structure est renvoyée par une fonction en ligne, le compilateur peut choisir de conserver les membres de la structure dans des registres au lieu d'allouer de la mémoire et de copier les valeurs. Ceci est motivé par la règle « comme si », qui permet au compilateur d'optimiser de manière à préserver le comportement logique du code source tout en améliorant l'efficacité.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!