Ces deux citations répondre à votre question. Ils sont originaires de la norme C11. IIRC C++11 a quelque chose de similaire.
§5.1.2.3p4:
Dans la machine abstraite, toutes les expressions sont évaluées comme spécifié par
la sémantique. Une mise en œuvre effective n'a pas besoin d'évaluer le cadre d'un
expression si l'on peut en déduire que sa valeur n'est pas utilisée et qu'aucun
besoin d'effets secondaires sont produites (y compris les éventuels causés par l'appel d'une
la fonction ou l'accès à un objet volatile).
§5.1.2.3p6:
Au moins les exigences de la conformité de la mise en œuvre sont:
- Accède à la volatilité des objets sont évalués strictement selon les
les règles de la machine abstraite.
- À la fin du programme, toutes les données écrites dans les fichiers doivent être
identique au résultat que l'exécution du programme en fonction de la
sémantique abstraite aurait produit.
- L'entrée et la sortie de la dynamique de dispositifs interactifs prennent
lieu tel que spécifié dans
7.21.3. Le but de ces exigences est que les barrettes de mémoire ou de la ligne de tampon de sortie dès que possible, pour s'assurer que
invitant les messages apparaissent avant un programme en attente pour
d'entrée.
C'est le comportement observable du programme.
Considérons le programme suivant:
double YSinX(double x,int y)
{
double total = 0.0;
for (int i = 0; i < y; i++)
total += sin(x);
return total;
}
int main(void) {
printf("%lf\n", YSinX(PI, 4));
}
Votre compilateur peut se rendre compte que ce programme imprime 0.0\n
à chaque fois, et l'optimisation de votre programme :
int main(void) { puts("0.0"); }
C'est, en fournissant votre compilateur peut prouver que ni sin
ni YsinX
cause aucun besoin d'effets secondaires. Noter qu'ils peuvent (et probablement le faire) encore causer des effets secondaires, mais ils ne sont pas nécessaires pour produire la sortie de ce programme.
Vous avez posé une question sur le "compilateur". Si vous faites allusion à tous les C ou C++ implémentations, il n'y a aucune garantie d'optimisations et d'un C mise en œuvre n'a même pas besoin d'être un compilateur. Si vous faites allusion à un particulier C ou C++ mise en œuvre, je ne sais pas ce que vous faites allusion, et il n'a pas d'importance de toute façon. Si votre C ou C++ compilateur n'est pas de produire un code optimal, obtenir un nouveau compilateur ou de produire de l'optimisation de vous-même (de préférence par la modification de votre compilateur, de sorte que vous pouvez envoyer un patch pour les développeurs et ont l'optimisation automatiquement propagé à d'autres projets).