le mot clé volatile en langage C? [dupliquer]
Cette question a déjà une réponse ici:
- Pourquoi volatile est-il nécessaire en C? 16 réponses
J'ai une question sur volatile en langage C.
J'ai lu un tutoriel mais je ne peux toujours pas comprendre, certains disent que le volatile indique à l'optimiseur de complier que les opérations impliquant cette variable ne doivent pas être optimisées de certaines manières. cela signifie chaque fois que la valeur d'une variable est modifiée dans le registre, la valeur doit affecter la mémoire.
Et aussi certains disent que volatile signifie que la valeur peut être modifiée par des moyens en dehors de ce code.
Je ne peux pas comprendre le deuxième dicton, de sorte que la variable volatile peut être modifiée par des moyens en dehors de ce code? comment? et sont ces deux dit à la fois droit?
6 réponses
L'instruction "la valeur peut être modifiée par des moyens en dehors de ce code" signifie essentiellement qu'un autre programme ou matériel peut mettre à jour cette variable. C'est tout à fait possible. Une façon de penser à cela est en reliant ce concept à un fichier qui est partagé entre plusieurs programmes. Un fichier peut être ouvert, écrit et lu par de nombreux programmes à la fois. Lorsque vous lisez à partir d'un fichier, vous voulez vous assurer que vous lisez la dernière mise à jour et non la plus ancienne.
Retour au volatile mot-clé, placer volatile avant une variable, en effet, fait la même chose. Il s'assure que ce que vous lisez de la variable n'est pas basé sur l'optimisation du compilateur ou une ancienne copie de la variable que votre programme avait. De plus, le mot clé volatile garantit que la variable est extraite de la mémoire à chaque accès. Par conséquent, ces deux déclarations sont correctes en ce qui concerne le mot-clé volatile.
C n'est pas nécessairement pour les ordinateurs. Par exemple, si vous développez pour Game Boy Advance, vous rencontrez souvent des emplacements de mémoire modifiés par le matériel, donc vous ne pouvez pas modifier la variable dans votre code, mais elle est modifiée de toute façon. C'est ce que volatile
signifie.
En ajoutant le mot clé volatile
, Vous dites au compilateur que "la valeur stockée dans cette variable (emplacement mémoire) peut changer sans que mon code fasse quoi que ce soit."
Considérez l'un des éléments suivants:
- une application multithread,
- une application utilisant la mémoire partagée,
- une application s'exécutant sur une plate-forme qui mappe les registres d'E/S dans l'espace d'adressage,
- une application avec DMA matériel se produisant en arrière-plan.
Dans chacune de ces situations, la mémoire peut être modifiée en dehors du thread courant.
Notez que " chaque fois que la valeur d'une variable est changée dans le registre, alors la valeur devrait affecter la mémoire " est correct, tout simplement pas très clair.
Un emplacement de mémoire peut être modifié en dehors d'un code de programmes de nombreuses façons. Par exemple, une lecture DMA à partir d'un disque peut écrire dans un tampon, ou un périphérique mappé en mémoire peut changer d'emplacement en raison d'un événement sur le périphérique.
Cette adresse, par exemple, les applications multi-threads: la valeur d'une variable peut être modifiée par plusieurs threads et doit donc être "synchronisée" avec la mémoire de chaque accès (qu'il s'agisse de lire ou d'écrire la valeur).
Déclarer une variable volatile signifie que vous demandez au compilateur de ne pas optimiser l'extrait de code autour de cette variable. Cela force le processeur à ne pas utiliser la valeur de la variable des registres locaux ou de la mémoire cache, mais à récupérer la valeur de la mémoire principale à chaque fois.