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