Dans le cas suivant, le compilateur est-il autorisé à optimiser l'appel à foo()
et/ou à l'ensemble du bloc if
?Optimisation du compilateur à court-circuité autorisé C/C++
if(foo() && 0)
{ ... }
Dans le cas suivant, le compilateur est-il autorisé à optimiser l'appel à foo()
et/ou à l'ensemble du bloc if
?Optimisation du compilateur à court-circuité autorisé C/C++
if(foo() && 0)
{ ... }
D'un point de normes de vue, le compilateur doit évaluer le côté gauche, à savoir foo()
doit être appelé:
[C99, 6.5.13] Contrairement l'opérateur binaire bit à bit
&
, l'opérateur&&
garantit une évaluation de gauche à droite; il y a un point de séquence après l'évaluation du premier opérande. Si le premier opérande est égal à 0, le second opérande n'est pas évalué.
Mais comme il sait que le corps de la déclaration if
ne peut jamais être atteint, * alors il est libre d'omettre tout code correspondant pour cette partie.
Bien sûr, si le compilateur peut prouver que foo()
n'a pas d'effets secondaires observables, alors il est également libre d'optimiser cet appel. Mais cela a peu à voir avec le comportement de court-circuit.
foo()
ne retourne pas un type avec une surcharge de operator&&
.
+1. Je pense que \ _ \ _ attribute \ _ \ _ ((pure)) vaut la peine d'être mentionné ici. – Elazar
@Elazar: Considérant que 'foo()' n'a aucun argument, et que les fonctions pures dépendent uniquement de leurs arguments, 'foo()' devrait vraiment retourner une constante. Et puis "constexpr" est la meilleure solution. – MSalters
code équivalent:
int x = (int) foo();
if (x)
if (0)
{ ... }
peut vous "optimiser loin" la première ligne, pour foo arbitraire? foo
peut-être quelque chose comme
int foo() {
printf("x");
return 0;
}
Le compilateur doit effectuer foo
avant de déterminer que 0
signifie la déclaration dans le if
n'est pas exécutée. Cependant, si foo
est une fonction très simple qui n'a aucun effet secondaire (ne modifie aucun état global - et il y a une définition longue dans les normes C et C++), alors elle peut être optimisée. Généralement, cela ne se produit que si foo
fait partie du même code source.
Le compilateur est autorisé à faire tout ce qui produit le bon résultat tel que défini par la norme C ... donc si foo() peut être optimisé dépend de ce qu'il fait, et bien sûr il peut optimiser le bloc if car il n'est jamais exécuté. –