• [^] # Re: "Tail call optimization"

    Posté par . En réponse au journal Chantonnons en récursion. Évalué à 2.

    L'optimisation de queue consiste à simplement mettre à jour les arguments de des argument dans la pile et à faire un jump sur la première instruction de la fonction au lieux de les empiler une nouvelle fois et de faire un call.
    Là, il n'y a pas une fonction, mais trois. C'est pas possible de faire tourner ça sur place (il n'y a qu'un seul sommet de pile). Sauf si gcc remarque que ce code est compilable sans récursion, ce qu'il fait (gcc 4.7 avec -O2, les fonctions a, b et c sont là pour l’empêcher « d'optimiser » le programme en "while(1);"

    head:
     subq 8ドル, %rsp
     xorl %eax, %eax
     call c
     addq 8ドル, %rsp
     jmp love #au lieu de faire un appel récursif. 
    blood: 
     subq 8ドル, %rsp
     xorl %eax, %eax
     call b
     addq 8ドル, %rsp
     jmp head
    love: 
     subq 8ドル, %rsp
     xorl %eax, %eax
     call a
     addq 8ドル, %rsp
     jmp blood
    
    

    Please do not feed the trolls