Kevin Kofler
:Pollux
: Je doute vraiment de ça. [...] Mais avant d'avoir pris &x, je ne vois absolument pas ce qui empêcherait le compilo d'optimiser tout ce qu'il veut. La règle "as-if" est tout de même fondamentale : elle permet non seulement l'optimisation, mais aussi la portabilité.
Standard C99, paragraphes 5.1.2.3 [#2], [#3] et [#5], 6.7.3 [#6].
La partie 5.1.2.3 spécifie la règle as-if, et il y a écrit explicitement que volatile veut dire ce que j'ai décrit.
Tu rigoles? La règle 5.1.2.3 n'entre absolument pas en contradiction avec ce que j'ai dit. En particulier, ils ne contredisent pas la règle "as-if", et ils n'obligent pas à créer une "case mémoire". Ils disent juste qu'il faut mettre un agreement point à chaque modification d'un volatile, ce qui est effectivement le cas même si le compilo met la variable dans un registre. La règle 6.7.3 ne parle pas vraiment de la chose.
Non, franchement, cite-moi quelque chose qui prouve indubitablement qu'on n'a pas le droit de compiler :
void f() { volatile int i=0; i=1; g(i); }
en
f: moveq #1,d0 bra g
Pour moi c'est parfaitement légal.
Quant à l'URL de Microsoft, elle est volontairement vague et dit juste "si vous voulez être sûr que ça écrit tout le temps, utilisez volatile". Ca n'a pas la vocation d'une règle infaillible. Ca marche comme si ça écrivait tout le temps.
Et je ne vois pas le rapport entre Microsoft et GTC, si ce n'est qu'on a choisi une syntaxe bien plus pratique que celle de GNU (qui, dois-je le rappeler, est plus ou moins justifiée par le nombre incalculable de plateformes qui doivent être supportées, mais n'est pas conçue pour un usage intensif...)