Zusammenfassung: Was bewirkt das Schlüsselwort volatile
, wenn es auf eine Funktionsdeklaration in C und C++ angewendet wird?Flüchtige Funktion
Einzelheiten:
Ich sehe, dass es möglich ist, eine Funktion zu erstellen, die als volatile
markiert. Ich bin mir jedoch nicht sicher, welche Compiler-Optimierung (falls vorhanden) dies verhindert. Zum Beispiel habe ich den folgenden Testfall:
volatile int foo() {
return 1;
}
int main() {
int total = 0;
int i = 0;
for(i = 0; i < 100; i++) {
total += foo();
}
return total;
}
Wenn ich mit clang -emit-llvm -S -O3 test.c
kompilieren (gcc auch funktionieren würde, aber das llvm IR ist besser lesbar meiner Meinung nach) erhalte ich:
target triple = "x86_64-unknown-linux-gnu"
define i32 @foo() #0 {
ret i32 1
}
define i32 @main() #0 {
ret i32 100
}
So offensichtlich die Compiler war in der Lage, die Aufrufe zu Funktion foo()
zu optimieren, so dass main()
eine Konstante zurückgibt, obwohl foo()
als volatile
markiert ist. Meine Frage ist also, ob volatile
überhaupt etwas tut, wenn es auf eine Funktionsdeklaration angewendet wird, um Compileroptimierungen einzuschränken.
(Hinweis in dieser Frage mein Interesse ist vor allem Neugier zu verstehen, was volatile
tut, anstatt irgendeine spezifisches Problem zu lösen.)
(Auch ich markiert habe diese Frage, da beide C und C++ nicht, weil ich denke, sie sind die gleiche Sprache, aber weil ich interessiert zu wissen, ob es Unterschiede gibt in was in diesem Fall in diesen beiden Sprachen).
Sie haben eine Funktion, die eine "volatile int" zurückgibt, keine flüchtige Funktion. – ildjarn
Ich glaube nicht, dass das wirklich ein * Duplikat * ist und das Schließen ist falsch, aber egal. Ein wichtiger Unterschied in C++ sind "flüchtige" Elementfunktionen. Schauen Sie sich http://stackoverflow.com/questions/4826719/c-volatile-member-functions an. –
Werfen Sie einen Blick auf http://www.drdobbs.com/cpp/volatile-the-multithreaded-programmers-b/184403766 – user1929959