Maison >développement back-end >C++ >Pourquoi le registre RAX est-il poussé sur la pile pendant les appels de fin avec std :: fonction ?

Pourquoi le registre RAX est-il poussé sur la pile pendant les appels de fin avec std :: fonction ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-12 19:07:10326parcourir

Why is the RAX Register Pushed onto the Stack During Tail Calls with std::function?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn