Maison >développement back-end >C++ >Pourquoi la fonction « f » pousse-t-elle RAX sur la pile avant d'autres opérations ?
Alignement de la pile d'appels de fonction
Dans le code assembleur fourni, il peut être déroutant de voir RAX être poussé sur la pile comme première opération dans la fonction f. Comprendre le raisonnement derrière cette action nécessite un examen de l'ABI 64 bits.
L'ABI 64 bits exige que la pile soit alignée sur 16 octets avant une instruction d'appel. Cependant, l'instruction d'appel pousse une adresse de retour de 8 octets sur la pile, perturbant cet alignement. Par conséquent, le compilateur est obligé de mettre en œuvre des mesures pour réaligner la pile à un multiple de 16 avant de passer au prochain appel.
Dans ce contexte, pousser une valeur indifférente, telle que RAX, sert un objectif efficace. Il fournit un moyen d'aligner la pile sans encourir la surcharge liée à l'exécution d'une instruction sub rsp, 8 supplémentaire, qui peut être moins efficace sur les processeurs équipés d'un moteur de pile.
La comparaison avec un tailcall sans std : :function wrapper illustre ce principe. Dans la fonction triviale g, le compilateur peut simplement exécuter une instruction jmp sans aucune action préalable d'alignement de pile. Cependant, dans le cas de f, une poussée supplémentaire de RAX est nécessaire pour maintenir l'alignement sur 16 octets, garantissant ainsi la compatibilité avec les exigences ABI.
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!