IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Que veut dire le mot clé volatile ?


Sujet :

Langage C++

  1. #1
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 57
    Par défaut Que veut dire le mot clé volatile ?
    [3DArchi] Fork de cette discussion [/3DArchi]

    Bonjour,
    Excusez moi ce n'est pas vraimment en reponse au sujet du thread mais je me demandais quel est l'effet du mot cles volatile sur une fonction?

    merci.

  2. #2
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Tout comme const, si tu déclares un objet volatile tu ne peux que appeler des fonctions membres volatiles de cet objet.

  3. #3
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 633
    Par défaut
    Salut,

    Le mot clé volatile indique au compilateur que la valeur de (la variable /le membre) est susceptible d'être modifiée entre deux évaluation de celle-ci.

    Cela aura essentiellement comme résultat d'empêcher le compilateur d'effectuer certaines optimisations (comme le fait de placer la variable dans un registre), et donc de forcer le fait de récupérer à chaque fois la valeur ad-hoc en mémoire.

    Les modifications peuvent survenir:
    • suite à une modification apportée par le système d'exploitation
    • suite à une modification apportée par un thread concurrent
    • ...
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,

    volatile pour une variable signifie qu'y accéder est un effet de bord. Cela veut dire que même une lecture peut changer son état ou l'état d'une autre partie du programme. Ou dit autrement encore, une variable volatile peut changer de valeur ou provoquer le changement de valeur d'autres variables par des moyens inconnus par le compilateur. Cela permet d'éviter certaines optimisations du compilateur.

    Une fonction volatile indique que this et par conséquence les membres de la classe doivent être considérés comme volatile.

    A quoi ça sert ? En bas niveau, c'est utilisé lorsqu'on accède à des variables (zones mémoires) gérées par le hard.
    Exemple tiré d'un dev.
    La datasheet de la flash me dit que je dois faire 2 lectures consécutives à un endroit bien précis. Si j'ai la même valeur, alors la flash est disponible pour une opération d'écriture, de lecture ou d'effacement. Si non, cela signifie que la flash est occupée et je ne peux y accéder ni en lecture ni en écriture.
    Si le code est écrit comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    const int flash_status;
    bool is_flash_ready()
    {    
        int const status1 = flash_status;
        int const status2 = flash_status;
        int const toggle = status1^status2;
        if(toggle)
        {//flash busy
            return false;
        }
        else
        {//flash ready
            return true;
        }
    }
    Le compilateur est légitime à déduire que status1 et status2 ont la même valeur, donc status1^status2 vaut 0, donc toggle vaut 0 donc je passe toujours par le else. Et par là, supprimer tout le code qu'il juge inutile et transformer la fonction en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bool is_flash_ready()
    {
       return true;
    }
    A contrario, si j'écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    const volatile int flash_status;
    bool is_flash_ready()
    {    
        int const status1 = flash_status; // (1)
        int const status2 = flash_status; // (2)
        int const toggle = status1^status2;
        if(toggle)
        {//flash busy
            return false;
        }
        else
        {//flash ready
            return true;
        }
    }
    On indique au compilateur que la valeur de flash_status entre (1) et (2) peut changer sans qu'il le sache. Et donc de ne rien déduire ni optimiser là dessus.

    Tu remarques que la variable est volatile et const. Serait-ce contradictoire En fait non. volatile dit que la variable peut changer par des mécanismes inconnus du compilateur. const dit que le programme ne peut pas changer la variable et donc le compilateur doit le vérifier. Seule la lecture est autorisée. L'écriture est interdite. Les deux qualificatifs ont bien un sens différent l'un de l'autre.


    C'est aussi un bug récurrent en embarqué lorsqu'on oublie le qualificatif volatile et que l'on accède à une variable dans une boucle. Le compilateur sort l'évaluation de la variable à l'extérieur de la boucle à des fins d'optimisations ... mais ça change tout par rapport à ce que voulait faire le développeurs.

    Voilà pour l'utilité de volatile.

    Un dernier point, volatile n'a rien à voir avec la programmation multithread. La volatilité de la variable est du à des éléments externes au programme.

  5. #5
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 57
    Par défaut
    Bonjour,

    Je vous remerci pour vos reponses clairs et precises.
    J'ai compris l'utilites de ce mot cles.

    Merci encore pour votre temps et bonne journee!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AS] Que veut dire AND
    Par jbidou88 dans le forum Flash
    Réponses: 2
    Dernier message: 31/05/2006, 11h21
  2. que veut dire (nrow >= 6) && (~nrow&0x01)
    Par gronaze dans le forum C
    Réponses: 12
    Dernier message: 24/03/2006, 15h00
  3. [WD9] Que veut dire AGL?
    Par afrikha dans le forum WinDev
    Réponses: 4
    Dernier message: 24/10/2005, 11h15
  4. Que veut dire ce symbole?
    Par tlemcenvisit dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 24/06/2005, 22h25
  5. Que veut dire "volatile" devant une variable ?
    Par altahir007 dans le forum C
    Réponses: 4
    Dernier message: 23/06/2004, 15h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo