Un pointeur de la forme
volatile int* p;
est un pointeur vers un int
que le compilateur traitera comme volatile
. Cela signifie que le compilateur supposera qu'il est possible pour la variable que p
a été modifié, même si rien dans le code source ne suggère que cela puisse se produire. Par exemple, si je définis p
pour pointer vers un entier normal, alors chaque fois que je lis ou écris *p
le compilateur est conscient que la valeur peut avoir changé de manière inattendue.
Il existe un autre cas d'utilisation d'un volatile int*
: Si vous déclarez un int
comme volatile
alors vous ne devez pas le pointer avec un habituel int*
. Par exemple, c'est une mauvaise idée :
volatile int myVolatileInt;
int* ptr = &myVolatileInt; // Bad idea!
La raison en est que le compilateur C ne se souvient plus que la variable pointée par ptr
est volatile
il peut donc mettre en cache la valeur de *ptr
dans un registre de manière incorrecte. En fait, en C++, le code ci-dessus est une erreur. Au lieu de cela, vous devriez écrire :
volatile int myVolatileInt;
volatile int* ptr = &myVolatileInt; // Much better!
Maintenant, le compilateur se souvient que ptr
points à un volatile int
Il n'essaiera donc pas (ou ne devrait pas !) d'optimiser les accès par le biais de l'option *ptr
.
Un dernier détail - le pointeur dont vous avez parlé est un pointeur vers un volatile int
. Vous pouvez également le faire :
int* volatile ptr;
Cela signifie que le pointeur lui-même est volatile
Ce qui signifie que le compilateur ne doit pas essayer de mettre en cache le pointeur en mémoire ou d'optimiser la valeur du pointeur parce que le pointeur lui-même pourrait être réaffecté par quelque chose d'autre (matériel, etc.) Vous pouvez combiner ces deux éléments si vous souhaitez obtenir cette bête :
volatile int* volatile ptr;
Le compilateur ne peut pas optimiser le pointeur lui-même, et il ne peut pas optimiser ce qui est pointé.
J'espère que cela vous aidera !