Bonjour,
J'ai écrit un algorithme récursif que je n'arrive pas à transformer en aglorithme itératif. En plus le code est assez simple de lecture dans sa version récursive.
Dans un soucis d'optimisation, je voudrais donc savoir si il n'est pas possible de stocker les adresses de retour de fonction ailleurs que dans une pile. Ou du moins, s'il existe un quelconque mécanisme d'optimisation pour la récursivité.
Merci d'avance,
# Je ne sais pas comment faire autrement
Posté par mathieu mathieu (site web personnel) . Évalué à 1.
Il faut bien mémoriser les differents états, pour retrouver le contexte n-1 en cas d'échec de la branche ...
[^] # Re: Je ne sais pas comment faire autrement
Posté par Henry-Nicolas Tourneur (site web personnel) . Évalué à 1.
[^] # Re: Je ne sais pas comment faire autrement
Posté par NeoX . Évalué à 1.
je suis sceptique sauf dans le cas ou tu as un nombre defini d'iteration connu à l'avance.
apres, forcer l'usage du cache processeur, il faut pouvoir coder en assembleur pour taper directement dedans.
[^] # Re: Je ne sais pas comment faire autrement
Posté par Henry-Nicolas Tourneur (site web personnel) . Évalué à 1.
[^] # Re: Je ne sais pas comment faire autrement
Posté par -=[ silmaril ]=- (site web personnel) . Évalué à 5.
Le cache du CPU .. et bien c'est un cache pas une mémoire et en tant que tel il est géré par le CPU, à un comportement spécifique au
CPU et est inaccessible (directement) par le compilateur / programmeur.
De plus en environnement multi-tache il est susceptible d'être modifié de façon aléatoire par l'exécution des autres programmes et du kernel.
Et même si ce cache était fiable il ne serait pas suffisamment grand pour stocker toutes les données d'une fonction récursive ou alors il faudrait peu de récursion et peu de variables (chaque variable déclarée dans ta fonction récursive est déposée sur la pile avant l'adresse de retour).
Note: un programmeur asm de bon niveau avec suffisamment de connaissances sur le CPU qu'il utilise peut optimiser l'usage du cache sur un OS mono-tache et uniquement dans ce cas.
[^] # Re: Je ne sais pas comment faire autrement
Posté par Mathieu Schroeter (site web personnel, Mastodon) . Évalué à 1.
Par exemple :
Mais ça ne veut pas dire que le compilateur le fera...
[^] # Re: Je ne sais pas comment faire autrement
Posté par Henry-Nicolas Tourneur (site web personnel) . Évalué à 1.
[^] # Re: Je ne sais pas comment faire autrement
Posté par Mathieu Schroeter (site web personnel, Mastodon) . Évalué à 1.
Et en ce qui concerne "register", sache qu'un compilateur évolué comme GCC le fait en fonction des optimisations qu'il tente d'appliquer à une source, et cela même si tu n'utilises pas cette classe de mémorisation dans ton code. Donc c'est bien possible que tu ne vois aucune différence en l'utilisant explicitement.
# Récursivité terminale
Posté par lasher . Évalué à 2.
Sinon, même sans « dérécursiver », une forme récursive terminale en C revient à avoir un pointeur vers les données modifiées, de façon à ne copier que l'adresse du pointeur à chaque appel récursif et à modifier directement ta structure (en gros, ça revient vaguement à gérer toi-même ta pile d'arguments).
[^] # Re: Récursivité terminale
Posté par lasher . Évalué à 2.
Je voulais dire « itérative » bien sûr.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.