Puisque vous utilisez GCC et vous dire que faire la volatile
variable ne fonctionne pas, vous pouvez tromper l'optimiseur en pensant que la boucle change la variable en mentant au compilateur:
while(global)
asm volatile("" : "+g"(global));
C'est une instruction d'assemblage en ligne qui dit qu'elle modifie la variable (elle est passée comme un opérande d'entrée-sortie). Mais il est vide, donc évidemment, il ne fait rien à l'exécution. Pourtant, l'optimiseur pense qu'il modifie la variable - les programmeurs l'ont dit, et le compilateur, interdisant la substitution d'opérande (ce qui signifie simplement remplacer un texte par un autre), ne se soucie pas vraiment du corps de l'assemblage inline et ne fera aucune choses drôles. Et comme le corps est vide et que la contrainte l'utilise comme la plus générique disponible, elle devrait fonctionner de manière fiable sur toutes les plates-formes où GCC supporte l'assemblage en ligne.
@ Styne666: le titre est la question – Necrolis
Voir aussi http://stackoverflow.com/q/7083482/594137 –
@ Styne666 - ce n'est pas une bonne pratique d'écrire du code qui nécessite une configuration de compilateur spécifique pour fonctionner. Ainsi, la désactivation de l'optimisation n'est pas une option pour le code de production. – 0xbadf00d