Maison > développement back-end > C++ > Les compilateurs C/C utilisent-ils des instructions Push/Pop pour la création de variables locales ?

Les compilateurs C/C utilisent-ils des instructions Push/Pop pour la création de variables locales ?

Mary-Kate Olsen
Libérer: 2024-12-09 11:58:10
original
258 Les gens l'ont consulté

Do C/C   Compilers Utilize Push/Pop Instructions for Local Variable Creation?

Compilateurs C/C avec instructions Push/Pop pour les variables locales

Introduction

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.

Prise en charge des compilateurs

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.

Avantages de Push/Pop

L'utilisation de push/pop pour les variables locales offre plusieurs avantages :

  • Réduction de la taille du code : Les instructions push ne font que 2 octets, contre 9 à 11 octets pour paires sub/mov.
  • Amélioration potentielle des performances : Sur les processeurs dotés d'un moteur de pile, les opérations push peuvent entraîner moins d'uops de synchronisation de pile que le sub rsp, ce qui les rend plus rapides dans certains scénarios.

Quand éviter le Push/Pop

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].

Cas d'utilisation pratique

Considérez la fonction suivante :

int extfunc(int *,int *);

void foo() {
    int a=1, b=2;
    extfunc(&a, &b);
}
Copier après la connexion

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
Copier après la connexion

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 .

Conclusion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal