Comprendre le stockage d'objets dans l'assembly (x86)
Dans l'assembly x86, les objets sont stockés sous forme de blocs de mémoire contigus. Ils ne sont pas intrinsèquement associés à des classes comme dans les langues de niveau supérieur ; au lieu de cela, ce sont simplement des sections d'octets qui peuvent être manipulées par le programme.
Stockage des structures et des classes
Les structures et les classes sont stockées de la même manière, sauf que les classes avec les membres virtuels ont une "vtable" implicite ajoutée comme premier élément. Cette table virtuelle contient des pointeurs vers l'implémentation de chaque fonction virtuelle, permettant une liaison dynamique.
Accès aux fonctions membres
Les fonctions membres sont accessibles via un pointeur implicite "this", qui est passé comme premier argument à la fonction. Ce pointeur pointe vers l'objet dont les membres sont accédés.
Répartition des fonctions virtuelles
Lorsqu'une fonction virtuelle est appelée, le compilateur vérifie la table virtuelle de l'objet pour déterminer la bonne mise en œuvre de la fonction. Ce comportement dynamique permet un comportement polymorphe dans lequel différentes classes dérivées peuvent remplacer les fonctions virtuelles de la classe de base.
Optimisation du registre
Le compilateur peut choisir d'optimiser l'allocation de mémoire pour les structures , notamment pour les petites structures ou les variables locales. Il peut conserver les membres de la structure dans les registres du processeur, éliminant ainsi le besoin d'accès à la mémoire.
Exemple
Considérez le code suivant :
struct foo { int m_a; int m_b; void inc_a() { m_a++; } void inc_b() { m_b++; } };
Le code assembleur de la fonction inc_b serait :
foo::inc_b(): mov eax, DWORD PTR [rdi+4] # eax = this->m_b lea edx, [rax+1] # edx = eax+1 mov DWORD PTR [rdi+4], edx # this->m_b = edx ret
Dans ce code, l'implicite Le pointeur "this" est passé dans le registre rdi et les valeurs sont stockées à 4 octets de distance dans l'objet, comme déterminé par le compilateur.
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!