C++ volatile des fonctions de membre du
class MyClass
{
int x, y;
void foo() volatile {
//do stuff with x
//do stuff with y
}
};
Dois-je déclarer x
et y
comme volatile
ou seront toutes les variables de membre traités comme des volatile
automatiquement?
Je veux faire en sorte que les "choses" avec x
" n'est pas réorganisée avec les "trucs avec y
" par le compilateur.
EDIT:
Qu'advient-il si je suis en jetant un type normal pour un volatile
type? Serait-ce de demander au compilateur de ne pas réorganiser l'accès à cet emplacement? Je veux passer une variable normale dans une situation spéciale, une fonction de paramètre qui est volatile. Je dois être sûr que le compilateur ne pas réorganiser cet appel préalable ou suivie de lectures et d'écritures.
Vous devez vous connecter pour publier un commentaire.
Marquage d'une fonction membre
volatile
est comme marquantconst
; cela signifie que le récepteur de l'objet est traité comme s'il était déclaré comme unvolatile T*
. Par voie de conséquence, toute référence àx
ouy
sera traitée comme unevolatile
lire dans la fonction membre. En outre, unvolatile
objet ne peut appelervolatile
des fonctions de membre du.Cela dit, vous pouvez marquer
x
ety
volatile
de toute façon si vous voulez que tous les accès à les traiter commevolatile
.Vous ne pas devez déclarer les variables explicitement..
De la Norme docs 9.3.2.3,
Le code suivant:
Génère une erreur lors de la compilation avec gcc:
Et depuis un
volatile
instance ne peut pas appeler unnon-volatile
méthode, on peut supposer que, oui,x
ety
seravolatile
dans la méthode, même si l'instance deMyClass
n'est pas déclarévolatile
.Remarque: vous pouvez supprimer le
volatile
qualificatif à l'aide d'unconst_cast<>
si jamais vous avez besoin, mais être prudent, car tout commeconst
cela peut conduire à un comportement indéfini dans certains cas.g++
suggère que vous pouvez en effet appelvolatile
fonctions de membre du sur-volatile
objets. La raison quevolatile std::string
s sont inutiles, c'est parce que si la chaîne elle-même estvolatile
, il ne peut qu'appelervolatile
fonctions de membre, ce qui n'est pas. $4.4.1 de la norme précise que vous pouvez convertir un T* pour un volatile T* implicitement, et $9.3.1.3 dit que levolatile
qualificatif affecte lathis
pointeur, ce qui suggère que si vous avez un objet de typeT
, lethis
pointeur de typeT*
peut être convertie en unvolatile T*
pour l'appel.volatile
méthode à la fois d'unvolatile
etnon-volatile
instance. Mais si votre instance estvolatile
vous ne serez pas en mesure d'appelernon-volatile
méthodes.const
, comme templatetypedef dit. La partie pertinente n'est bien sûr pas g++, mais la norme: Article 4.4.1 semble pour m'indiquer que la nécessaire conversion implicite dethis
deT*
àvolatile T*
était tout à fait légale. Notez également que 9.3.2.4 explicitement dit que vous pouvez faire un appel à un cv qualifiés de la fonction si l'objet de l'expression que vous appelez il est “comme cv qualifiés ou moins de cv qualifiés de la fonction membre.” Aucune différence n'est faite entreconst
etvolatile
dans ce domaine.const
.IBM implique il fonctionne exactement comme const fonctions.
Donc, en utilisant l'exemple d'origine: