93 votes

Différence entre const et const volatile

Si nous déclarons une variable sous la forme volatile chaque fois que la nouvelle valeur est mise à jour
Si nous déclarons une variable comme const alors la valeur de cette variable ne sera pas modifiée

Alors const volatile int temp;
A quoi sert de déclarer la variable temp comme ci-dessus?
Que se passe-t-il si nous déclarons comme const int temp ?

152voto

Michael Burr Points 181287

Un objet marqué comme const volatile ne pourra pas être modifiée par le code (une erreur est déclenchée en raison de l' const qualifier) - au moins par le biais de ce nom/pointeur.

L' volatile le cadre de la phase qualificative signifie que le compilateur ne peut pas optimiser ou de réorganiser l'accès à l'objet.

Dans un système embarqué, il est généralement utilisé pour accéder à des registres matériels qui peuvent être lues et sont mis à jour par le matériel, mais n'ont pas de sens pour écrire (ou peut-être une erreur à écrire).

Un exemple pourrait être le registre de statut pour un port série. Les différents bits indique si un caractère est en attente d'être lu ou si la transmettre registre est prêt à accepter un nouveau personnage (c'est à dire., - elle est vide). Chaque lecture de ce registre d'état pourrait entraîner une valeur différente en fonction de ce que l'autre a eu lieu dans le port de série du matériel.

Il ne fait aucun sens d'écrire dans le registre d'état (selon le matériel spec), mais vous devez vous assurer que chaque lecture des résultats du registre dans un véritable lecture du matériel à l'aide d'une valeur mise en cache à partir d'une précédente lecture ne vais pas vous parler des changements dans le matériel de l'état.

Un exemple rapide:

unsigned int const volatile *status_reg; // assume these are assigned to point to the 
unsigned char const volatile *recv_reg;  //   correct hardware addresses


#define UART_CHAR_READY 0x00000001

int get_next_char()
{
    while ((*status_reg & UART_CHAR_READY) == 0) {
        // do nothing but spin
    }

    return *recv_reg;
}

Si ces pointeurs n'ont pas été marqués comme étant en volatile, quelques problèmes peuvent se produire:

  • la boucle while test peut lire l'état s'inscrire qu'une seule fois, car le compilateur pourrait supposer que ce qu'il a souligné ne change jamais (il n'y a rien dans la boucle while test ou de la boucle elle-même qui pourrait changer). Si vous avez entré la fonction quand il n'y a pas de personnage en attente dans UART matériel, vous pourriez vous retrouver dans une boucle infinie qui ne s'est jamais arrêté, même si un caractère a été reçu.
  • la lecture de ce registre pourrait être déplacé par le compilateur à l'avant de la boucle while de nouveau, car il n'y a rien dans la fonction qui indique qu' *recv_reg est modifié par la boucle, il n'y a aucune raison qu'il ne peut pas être lu avant d'entrer dans la boucle.

L' volatile qualificatifs s'assure que ces optimisations ne sont pas effectuées par le compilateur.

41voto

mingos Points 11608
  • volatile sera de dire au compilateur de ne pas optimiser le code lié à la variable, habituellement, lorsque nous savons qu'il peut être modifié à partir de "l'extérieur", par exemple, par un autre thread.
  • const sera de dire au compilateur qu'il est interdit pour le programme à modifier la valeur de la variable.
  • const volatile est une chose très spéciale, vous verrez probablement utilisé exactement 0 fois dans votre vie (tm). Comme on s'y attendait, cela signifie que le programme ne peut pas modifier la valeur de la variable, mais la valeur peut être modifiée à partir de l'extérieur, donc pas d'optimisations doivent être effectuées sur la variable.

29voto

Alexandre C. Points 31758

Ce n'est pas parce que la variable est constante qu'il peut ne pas avoir changé entre deux points de séquence.

La constance est une promesse que vous faites de ne pas changer la valeur, pas que la valeur ne sera pas changée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X