30898Fermer30900
ZerosquareLe 30/04/2017 à 22:45
Je ne pense pas que le compilateur fasse la différence entre une variable et une adresse explicite. Tout ce qu'il doit voir, c'est que tu fais un accès en écriture à une adresse, mais qu'il n'y a jamais d'accès en lecture à la même adresse. Du coup, il considère ça comme une action sans effet et il peut la virer.

Tu pourrais objecter "si on écrit ce genre de choses, c'est qu'on a de bonnes raisons de le faire, donc ça ne devrait pas être supprimé", mais en pratique il y a des cas pas évidents. Ça peut par exemple être la conséquence d'un #define d'une constante à zéro, qui peut transformer un bout de code normalement utile en coquille vide. Sans compter que l'optimisation ne se fait pas que sur ton code original, elle peut aussi être consécutive à une optimisation précédente qui aura dégagé d'autres trucs.

D'une manière générale, le fait que la spéc du C laisse autant de liberté dans l'implémentation, ça n'est pas juste pour pouvoir supporter toutes sortes de matériels ; ça permet aussi que les compilos fassent des optimisations assez poussées. D'ailleurs, le compilateur peut tirer parti du fait que certains trucs sont considérés comme indéfinis pour optimiser agressivement, même quand l'archi sous-jacente a un comportement déterministe, et ça a déjà posé problème plus d'une fois. (C'est pas pour rien si je dis que le C n'aurait jamais dû être utilisé pour des applications où avoir un code correct est critique cheeky)