D'autres réponses ont souligné l'importance de volatile
ici, et je n'ai rien à ajouter à cela. Cependant, je tiens à dire à quel point il est important qu'une telle construction existe, parce que est utile. De mon expérience de conception de matériel, plusieurs fois l'interface entre un CPU et un bloc logique dans HW est basée sur les écritures et les lectures de la mémoire. Cela signifie que lorsqu'une CPU lit un registre du HW, quelque chose se produit (c'est-à-dire, efface les effacements, avance la file d'attente, et beaucoup d'autres options).
Maintenant, une fois que vous exécutez l'accès à pleaseOptimizeMeOut
, car il est volatile
le compilateur suppose que vous pourriez avoir fait juste pour l'effet secondaire, il serait tout à fait tort de l'optimiser. Supposons que la variable soit mappée à une file d'attente matérielle et que vous vouliez juste avancer la file d'attente sans en prendre une valeur. Cela dit, mapper des variables aux registres lors de la lecture a des effets secondaires est une mauvaise pratique à mon humble avis, et il serait préférable de l'encapsuler avec un appel de fonction, exactement pour la raison que votre question démontre - c'est déroutant dans certains cas.
Mapper des variables sur des registres sans effets secondaires est très utile et largement utilisé, cependant.
Cet effet est en quelque sorte le "point" de "volatile". – SingleNegationElimination