Pourquoi le Push RAX initial dans cet assemblage d'appel de fonction ?
Dans la sortie d'assemblage de l'extrait de code C fourni, la fonction f affiche une première poussée du registre RAX vers le stack.
Justification
L'ABI x64 exige que l'alignement de la pile soit de 16 octets avant une instruction d'appel. Puisque l'appel pousse une adresse de retour de 8 octets sur la pile, perturbant l'alignement, le compilateur insère une opération push pour maintenir l'alignement.
Ce choix spécifique de pousser une valeur factice est optimisé pour les processeurs équipés d'un moteur de pile , qui peut exécuter l'instruction push plus efficacement que le sub rsp, 8.
En revanche, la fonction g, qui effectue un simple appel de fonction sans le wrapper std::function, ne nécessite pas d'ajustement de l'alignement de la pile et n'exécute donc pas cette poussée initiale.
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!