Sommario: Che cosa fa la parola chiave volatile
quando viene applicata a una dichiarazione di funzione in C e in C++?Funzione volatile
Dettagli:
vedo che è possibile compilare una funzione che è contrassegnato come volatile
. Tuttavia, non sono sicuro di cosa sia l'ottimizzazione del compilatore (se presente). Per esempio ho creato il seguente test case:
volatile int foo() {
return 1;
}
int main() {
int total = 0;
int i = 0;
for(i = 0; i < 100; i++) {
total += foo();
}
return total;
}
Quando compilo con clang -emit-llvm -S -O3 test.c
(gcc potrebbe anche funzionare, ma il IR LLVM è più leggibile a mio parere) ottengo:
target triple = "x86_64-unknown-linux-gnu"
define i32 @foo() #0 {
ret i32 1
}
define i32 @main() #0 {
ret i32 100
}
Così, ovviamente la il compilatore è stato in grado di ottimizzare le chiamate alla funzione foo()
in modo che main()
restituisca una costante, anche se foo()
è contrassegnato come volatile
. Quindi la mia domanda è se lo volatile
fa qualcosa quando viene applicato a una dichiarazione di funzione in termini di limitazione delle ottimizzazioni del compilatore.
(Nota il mio interesse per questa domanda è in gran parte la curiosità di capire che cosa volatile
fa, piuttosto che per risolvere qualsiasi problema specifico.)
(Anche io ho segnato questa domanda sia come C e C++ non perché penso che siano la stessa lingua, ma perché mi interessa sapere se ci sono differenze in ciò che volatile
fa in questo caso in queste due lingue).
Si ha una funzione che restituisce un 'volatile int', non una funzione volatile. – ildjarn
Non penso che sia davvero un * duplicato * e la chiusura non è corretta, ma qualunque sia. Una distinzione importante in C++ è rappresentata dalle funzioni membro "volatile". Consulta http://stackoverflow.com/questions/4826719/c-volatile-member-functions –
Dai un'occhiata a http://www.drdobbs.com/cpp/volatile-the-multithreaded-programmers-b/184403766 – user1929959