le compilateur optimise-t-il?
	
	
		Bonjour.
J'ai souvent entendu que les compilateurs actuels etaient capable d'optimiser bien mieux que nous et qu'il fallait leur laisser cette tâche. Cela m'amène a la question suivante
dans une fonction "principale", j'appelle a la suite une série de fonction. Elles retournent toutes un booléen qui vaut true si l'execution a reussi, false sinon.
Dès qu'une des fonction retourne false, j'arrète l'execution de la fonction principale et je retourne false.
J'ai plusieures façon d'écrire ça:
1:
	Code:
	
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
   |  
 
bool fonction_principale()
{
 bool valeurRetour=true;
 
 valeurRetour = fonction1();
 if(valeurRetour == true)
  {
    valeurRetour = fonction2();
    if(valeurRetour == true)
    {
     valeurRetour = fonction3();
     if(valeurRetour == true)
       {
          /* etc etc*/
       }
     }
    }
  }
return valeurRetour
} | 
 2:
	Code:
	
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
   |  
bool fonction_principale()
{
 bool valeurRetour=true;
 
 valeurRetour=fonction1();
 if(valeurRetour=false) return false;
 
 if(valeurRetour=true) valeurRetour=fonction2();
 if(valeurRetour=false) return false;
 
 if(valeurRetour=true) valeurRetour=fonction3();
 if(valeurRetour=false) return false;
 
 /* etc etc*/
 
 
 if(valeurRetour=true) valeurRetour=fonctionN();
 
return valeurRetour;
} | 
 je trouve la deuxième méthode beaucoup plus lisible. Mais le problème c'est que si la fonction1 retourne false, il y aura encore (n-1) tests effectués pour rien. Ma question c'est : est-ce que le compilateur se rend compte que j'effectue plein de fois le meme test a la suite, et est-ce qu'il générera le même code machine que dans le premiers cas?
(ou est-ce qu'il ne faut pas trop pousser quand même^^)
	 
	
	
	
		Re: le compilateur optimise-t-il?
	
	
		Il y a aussi ces 2 methodes:
	Code:
	
1 2 3 4 5 6 7 8 9 10
   |  
bool fonction_principale()
{
  if(fonction1())
    if(fonction2())
      if(fonction3())
        /* etc etc*/
          return fonctionN();
  return false;
} | 
 ou son pendant mais que je trouve moins elegant mais qui permet de ne pas partir trop loin en indentation
	Code:
	
1 2 3 4 5 6 7 8 9 10 11 12
   |  
bool fonction_principale()
{
  if(!fonction1())
    return false;
  if(!fonction2())
    return false;
  if(!fonction3())
    return false;
  /* etc etc*/
  return fonctionN();
} |