Une utilisation marginale de volatile est la suivante. Disons que vous voulez calculer la dérivée numérique d'une fonction f
:
double der_f(double x)
{
static const double h = 1e-3;
return (f(x + h) - f(x)) / h;
}
Le problème est que x+h-x
n'est généralement pas égal à h
en raison d'erreurs d'arrondi. Pensez-y : lorsque vous soustrayez des nombres très proches, vous perdez beaucoup de chiffres significatifs qui peuvent ruiner le calcul de la dérivée (pensez à 1.00001 - 1). Une solution de contournement pourrait être la suivante
double der_f2(double x)
{
static const double h = 1e-3;
double hh = x + h - x;
return (f(x + hh) - f(x)) / hh;
}
mais en fonction de votre plate-forme et des commutateurs de compilateur, la deuxième ligne de cette fonction peut être effacée par un compilateur à optimisation agressive. Vous écrivez donc à la place
volatile double hh = x + h;
hh -= x;
pour forcer le compilateur à lire l'emplacement mémoire contenant hh, en renonçant à une éventuelle opportunité d'optimisation.
2 votes
http://stackoverflow.com/questions/72552/c-when-has-the-volatile-keyword-ever-helped-you