2013-06-25 2 views
2

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) 
    { ... } 
+0

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é. –

Répondre

14

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.


* (C++ - uniquement) en supposant foo() ne retourne pas un type avec une surcharge de operator&&.

+0

+1. Je pense que \ _ \ _ attribute \ _ \ _ ((pure)) vaut la peine d'être mentionné ici. – Elazar

+0

@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

1

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; 
} 
+0

Oui, si foo est défini comme, disons 'int foo() {return 0; } ' – Spook

+0

" si ". Si vous avez une connaissance complète, vous pouvez toujours optimiser tout. Cela n'a rien à voir avec le court-circuit. – Elazar

2

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.

Questions connexes