Maison >développement back-end >C++ >Pourquoi RAX est-il poussé sur la pile avant un appel final avec une « std::function » ?
Pourquoi RAX est-il poussé vers la pile avant l'appel final ?
La sortie de l'assembly pour la fonction f prenant un argument std::function révèle une opération intrigante : juste avant l'appel final, RAX est poussé vers la pile. Ce comportement n'est pas observé dans un simple appel de queue sans le wrapper std::function.
Considérations sur l'alignement
La raison de pousser RAX est enracinée dans le 64 bits ABI, qui nécessite que la pile soit alignée sur 16 octets avant une instruction d'appel. L'instruction d'appel pousse une adresse de retour de 8 octets sur la pile, violant ainsi l'alignement. Pour remédier à cela, le compilateur doit réaligner la pile sur un multiple de 16 octets avant l'appel final.
Alignement efficace de la pile
Pousser une valeur indifférente comme RAX est un moyen efficace d'obtenir l'alignement de la pile car :
En poussant RAX, le compilateur satisfait à l'exigence d'alignement sans perturber le comportement de la fonction.
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!