Bonjour,
dans un projet je me retrouve dans un cas où plusieurs fonctions pourraient s’appeler mutuellement et former un cercle :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
void fonction1(params){
  ...
  fonction2();
}
void fonction2(){
  ...
  userCallback(); //appelle userFunction()
}
void userFunction(){
  ...
  fonction1();
}
Evidemment le problème avec ce genre de code, c'est qu'il génère une sorte d'arbre :
fonction1{
fonction2{
fonction3{
fonction1{
fonction2{
...
et puis au bout d'un moment stack overflow alors j'ai tout de suite oublié l'idée.
J'avais commencé à gérer ça avec des threads mais comme ce serais beaucoup plus simple et plus efficace de le faire avec la première méthode, je suis quand même allé chercher au cas où... je suis tombé sur une certaine "tail optimization", il semblerait que certains compilateurs transforment le "call" en "jump" quand l'appel est la dernière instruction de la fonction, ce qui corrige le problème.
Oui je sais c'est pas ce qu'il y a de plus propre comme code mais c'est ce qu'il y a de plus rapide et contourner cette méthode rendrais probablement le code 10x plus complexe.

Mais la question est (ou plutôt les questions) : Est-ce que ça marche dans mon cas ?
dans tous les exemple que j'ai trouvé, les fonctions n'étaient pas des "void", la dernière ligne était donc toujours quelque chose comme "return fonction(p);" dans mon cas les fonctions sont de type void, est-ce que appeler la fonction suffit ou je dois écrire quelque chose comme "return fonction();"
J'utilise visual studio, est-ce que le compilateur réalise l'optimisation ? si oui et-ce qu'il faut paramétrer quelque chose avant j'avais vu qu'en général l'optimisation de ne fait qu'en release, si c'est le cas peut-on la forcer ?

Merci de votre aide.