Les compilateurs C/C traditionnels créent des variables locales en augmentant le pointeur de pile (ESP) une fois. Cependant, l’utilisation d’instructions push/pop peut donner lieu à un code plus compact et potentiellement plus rapide. Cet article explore les compilateurs offrant cette optimisation.
La recherche indique que les quatre principaux compilateurs x86 (GCC, Clang, ICC et MSVC) n'utilisent pas actuellement push/ instructions pop pour créer des variables locales. Au lieu de cela, ils préfèrent une variante de l'ancienne méthode, en utilisant sub rsp, c pour diminuer le pointeur de pile.
L'utilisation de push/pop pour les variables locales offre plusieurs avantages :
Bien que le push/pop puisse être bénéfique, il n'est pas du tout recommandé cas. Par exemple, cela peut entraîner des opérations de synchronisation de pile supplémentaires lorsqu'il est mélangé avec les modes d'adressage [rsp x].
Considérez la fonction suivante :
int extfunc(int *,int *); void foo() { int a=1, b=2; extfunc(&a, &b); }
Compilation améliorée en utilisant push/pop :
# compiled for the x86-64 System V calling convention: # integer args in rdi, rsi (,rdx, rcx, r8, r9) 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
Remarque : Cet exemple optimise la compacité et la vitesse en superposant les 4 derniers octets de l'instruction push avec les 4 premiers octets de l'instruction lea .
Bien que les instructions push/pop puissent offrir des avantages en termes de taille de code et de performances pour la création de variables locales, elles ne sont actuellement pas utilisés par les compilateurs C/C traditionnels. Cela est probablement dû au potentiel d'opérations de synchronisation de pile supplémentaires et à la complexité de la gestion des décalages de pile. Cependant, à mesure que les optimisations du matériel et du compilateur évoluent, il est possible que le push/pop pour les variables locales soit plus largement adopté à l'avenir.
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!