Fonction volatile
Résumé: Quel est le mot-clé volatile
faire lorsqu'il est appliqué à une déclaration de fonction en C et en C++?
Détails:
Je vois qu'il est possible de compiler une fonction qui est marqué comme volatile
. Cependant, je ne suis pas sûr de ce que l'optimisation du compilateur (le cas échéant) cela empêche. Par exemple, j'ai créé un cas de test qui suit:
volatile int foo() {
return 1;
}
int main() {
int total = 0;
int i = 0;
for(i = 0; i < 100; i++) {
total += foo();
}
return total;
}
Quand je compile avec clang -emit-llvm -S -O3 test.c
(gcc également de travailler mais l'IR llvm est plus lisible à mon avis), je reçois:
target triple = "x86_64-unknown-linux-gnu"
define i32 @foo() #0 {
ret i32 1
}
define i32 @main() #0 {
ret i32 100
}
Alors, évidemment, le compilateur est capable d'optimiser loin les appels à la fonction foo()
de sorte que main()
retourne une constante, même si foo()
est marqué comme volatile
. Donc ma question est de savoir si volatile
n'importe quoi à tout quand il est appliqué à une déclaration de fonction en termes de limiter les optimisations du compilateur.
(Remarque mon intérêt pour cette question est surtout de la curiosité pour comprendre ce volatile
fait, plutôt que de résoudre un problème spécifique.)
(J'ai également marqué cette question à la fois comme le C et le C++ non pas parce que je pense qu'ils sont dans la même langue, mais parce que je suis intéressé de savoir si il y a des différences en ce qui volatile
est le cas dans ces deux langues).
source d'informationauteur Gabriel Southern
Vous devez vous connecter pour publier un commentaire.
Dans votre code, le
volatile
mot-clé ne s'applique pas à la fonction, mais pour le type de retour, c'est l'équivalent de:Maintenant, en C++, vous pouvez faire un membre fonction
volatile
de la même manière que leconst
qualificatif, et le comportement est le même:Fondamentalement, vous ne pouvez pas appeler un non-volatile (alterantively non-const) de la fonction sur un volatils (const respectivement) instance du type:
foo()
n'est pas volatile.C'est une fonction qui renvoie un
volatile int
.Qui est légal. Mais étrange pour un retour
int
.Fonctions membres, d'autre part, peut être
volatile
pour la même raison, ils peuvent êtreconst
.