web-dev-qa-db-fra.com

Quand utiliserais-je const volatile, register volatile, static volatile en C ++?

Je m'interroge sur les différentes utilisations du mot-clé volatile en combinaison avec les mots-clés registre, const et statique. Je ne sais pas quels sont les effets, donc je pense:

register volatile int T=10;

Suggérez au compilateur de stocker T dans un registre et la valeur de T peut être modifiée de quelque part à l'extérieur (OS, matériel, autre thread)

const volatile int T=10;

Le programme lui-même ne peut pas modifier T, mais T peut être modifié quelque part en dehors du code.

static volatile int T=10;

Si T est un membre de données d'une classe, cela signifie que tous les objets de la classe ont la même valeur pour T et T peut être modifié quelque part à l'extérieur. Si T est une variable globale dans un fichier, le code source dans d'autres fichiers (qui font partie du projet) ne peut pas accéder à T, mais T est accessible de l'extérieur. Si T est une variable locale dans une fonction, une fois initialisée, elle reste en mémoire jusqu'à la fin du programme et peut être modifiée de l'extérieur.

Mes pensées sont-elles correctes et n'importe quel développeur C++ expérimenté peut-il donner un exemple où ce qui précède peut être utilisé dans des applications du monde réel ou est très rare?

28
Avraam Mavridis
register volatile int T=10;

volatile qualificatif signifie que le compilateur ne peut pas appliquer d'optimisations ou réorganiser l'accès à T, tandis que register indique au compilateur que T sera largement utilisé. Si l'adresse de T est prise, l'indice est simplement ignoré par le compilateur. Notez que register est obsolète mais toujours utilisé.

Utilisation pratique:

Je ne l'ai jamais utilisé, je n'en ai jamais ressenti le besoin et je ne peux vraiment pas en penser à un moment.


const volatile int T=10;

Le qualificatif const signifie que le T ne peut pas être modifié par le code. Si vous essayez de le faire, le compilateur fournira un diagnostic. volatile signifie toujours la même chose que dans le cas 1. Le compilateur ne peut pas optimiser ou réorganiser l'accès à T.

Utilisation pratique:

  • Accès à la mémoire partagée en mode lecture seule.
  • Accès aux registres matériels en mode lecture seule.

static volatile int T=10;

static le qualificatif de stockage donne T la durée de stockage statique (C++ 11 §3.7) et liaison interne , tandis que volatile régit toujours l'optimisation et la réorganisation .

Utilisation pratique:

  • Identique à volatile sauf que vous avez besoin que l'objet ait une durée de stockage statique et soit inaccessible à partir d'autres unités de traduction.
32
Alok Save