Maison >développement back-end >C++ >Pourquoi le registre RAX est-il poussé sur la pile pendant les appels de fin avec std :: fonction ?
Alignement de la pile dans les situations d'appel final
La question se pose de savoir pourquoi le registre RAX est d'abord poussé vers la pile dans le code assembleur généré pour le code C qui interagit avec un objet std::function.
La nécessité de la pile Alignement
L'ABI 64 bits exige que la pile soit alignée sur 16 octets avant toute instruction d'appel. Lorsqu'un appel est effectué, il envoie une adresse de retour de 8 octets sur la pile, perturbant ainsi cet alignement. Pour remédier à ce problème, le compilateur doit prendre des mesures pour réaligner la pile à un multiple de 16 avant l'appel suivant.
Pousser une valeur jetable pour l'alignement
Au lieu d'exécuter "sub rsp, 8", poussant une valeur "ne s'en soucie pas", comme RAX, s'avère plus efficace sur les processeurs équipés d'un moteur de pile. En effet, une simple instruction push nécessite souvent moins de surcharge du processeur qu'une instruction sub rsp, 8.
Comparaison avec un Tailcall sans std::function Wrapper
Quand il y a n'y a pas de wrapper std::function présent, comme dans l'exemple "void g(void (*a)())", l'appel final est simple : une simple instruction de saut (jmp) pour la fonction cible. Aucune étape supplémentaire n'est nécessaire pour l'alignement de la pile puisque l'appel final maintiendra naturellement le bon alignement de la pile.
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!