Comprendre le stockage d'objets et l'accès aux fonctions membres dans l'assemblage x86
Stockage d'objets
Dans x86 Dans l'assembly, les objets, y compris les structures et les classes, sont stockés sous forme de blocs de mémoire contigus. Au sein de ces blocs, les variables membres sont organisées séquentiellement dans l'ordre dans lequel elles ont été déclarées. L'adresse de chaque variable membre augmente à mesure que le bloc est parcouru.
Accès aux fonctions membres
Les fonctions membres peuvent accéder aux objets via le pointeur this. Dans les fonctions non membres, l'adresse de l'objet est transmise implicitement comme premier argument. Cependant, ce n'est pas le cas pour les fonctions membres en raison du pointeur this implicite.
Le pointeur this pointe vers le début du bloc mémoire où l'objet est stocké. À l'aide de ce pointeur, les fonctions membres peuvent directement accéder et modifier les données membres de l'objet.
Par exemple, si nous avons une classe nommée foo avec les variables membres m_a et m_b, et une fonction membre inc_a qui incrémente m_a, l'assembly le code pour inc_a pourrait ressembler à ceci :
foo::inc_a(): mov eax, DWORD PTR [rdi+4] # eax = this->m_a lea edx, [rax+1] # edx = eax + 1 mov DWORD PTR [rdi+4], edx # this->m_a = edx ret
Fonctions de membre virtuel
Dans le cas de classes avec des fonctions de membre virtuel, un niveau supplémentaire d'indirection est introduit. Chaque instance de la classe stocke un pointeur vers une table de fonctions virtuelles (vtable). La table virtuelle contient des pointeurs vers les implémentations réelles des fonctions membres virtuelles.
Lorsqu'une fonction membre virtuelle est appelée, le programme passe d'abord à l'entrée de la table virtuelle pour cette fonction. La cible du saut est l'implémentation réelle de la fonction, qui est ensuite exécutée.
Optimisation du stockage d'objets
Bien que les objets soient généralement stockés en mémoire, ils peuvent également être stockés dans des registres. . Les compilateurs peuvent optimiser le code pour éviter de placer des objets en mémoire s'ils peuvent être conservés dans des registres tout au long de leur utilisation. Cette optimisation est possible lorsque l'objet est suffisamment petit pour tenir dans un registre et que ses membres sont activement utilisés.
Par exemple, une fonction qui renvoie une petite structure par valeur peut ne pas lui allouer de mémoire. Au lieu de cela, le compilateur peut regrouper les membres de la structure dans des registres et les renvoyer directement.
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!