Quels compilateurs C/C peuvent utiliser les instructions Push/Pop pour créer des variables locales ?
Introduction
Contrairement à la pratique courante consistant à augmenter progressivement l'ESP, cette question explore la possibilité d'utiliser des instructions push et pop pour établir des variables, visant à optimiser la compacité du code et éventuellement les performances.
Considérations sur le compilateur
Optimisation du compilateur :
Stack Engine Optimisation :
Échantillon de code
Considérez l'exemple suivant :
int extfunc(int *, int *); void foo() { int a=1, b=2; extfunc(&a, &b); }
Sortie du compilateur
GCC, ICC, MSVC et clang génèrent tous du code qui commence par une instruction push, suivie de manipulation de la pile et appel à extfunc. Cela concorde avec l'observation selon laquelle les compilateurs modernes utilisent Push pour les optimisations.
Solution optimale
Une autre solution optimisée serait :
push 2 # only 2 bytes lea rdi, [rsp + 4] mov dword ptr [rdi], 1 mov rsi, rsp # special case for lea rsi, [rsp + 0] call extfunc(int*, int*) pop rax # alternative to add rsp,8 ret
Dans dans ce cas, une seule instruction push alloue de l'espace pour les deux variables locales tout en laissant la pile alignée sur 16 octets. Cela optimise la taille du code et maintient l'efficacité.
Considérations supplémentaires
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!