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();
} |