Podsumowanie: Co robi słowo kluczowe volatile
po zastosowaniu do deklaracji funkcji w C i C++?Funkcja lotna
Szczegóły:
widzę, że to możliwe, aby skompilować funkcję oznaczoną jako volatile
. Jednak nie jestem pewien, co zapobiega optymalizacji kompilatora (jeśli jest). Na przykład stworzyłem następujący przypadek testowy:
volatile int foo() {
return 1;
}
int main() {
int total = 0;
int i = 0;
for(i = 0; i < 100; i++) {
total += foo();
}
return total;
}
Kiedy skompilować z clang -emit-llvm -S -O3 test.c
(gcc będzie również działać, ale IR LLVM jest bardziej czytelny moim zdaniem) uzyskać:
target triple = "x86_64-unknown-linux-gnu"
define i32 @foo() #0 {
ret i32 1
}
define i32 @main() #0 {
ret i32 100
}
Więc oczywiście kompilator był w stanie zoptymalizować wywołania funkcji foo()
, dzięki czemu main()
zwraca stałą, mimo że foo()
jest oznaczona jako volatile
. Tak więc moje pytanie brzmi, czy volatile
robi cokolwiek w ogóle, gdy jest stosowane do deklaracji funkcji w kategoriach ograniczania optymalizacji kompilatora.
(Uwaga moje zainteresowanie w tej kwestii jest przede wszystkim ciekawość, aby zrozumieć, co volatile
robi zamiast rozwiązać każdy problem.)
(Również mam zaznaczone na to pytanie jako zarówno C i C++ nie dlatego, że myślą, że są ten sam język, ale ponieważ chcę wiedzieć, czy istnieją różnice w tym, co volatile
ma w tym przypadku w tych dwóch językach).
Masz funkcję zwracającą funkcję "volatile int", a nie zmienną. – ildjarn
Nie sądzę, że to naprawdę * duplikat *, a zamknięcie jest niepoprawne, ale cokolwiek. Ważnym wyróżnikiem w C++ są funkcje użytkownika 'volatile'. Sprawdź http://stackoverflow.com/questions/4826719/c-volatile-member-functions –
Spójrz na http://www.drdobbs.com/cpp/volatile-the-mithithreaded-programmers-b/184403766 – user1929959