2013-03-07 10 views
13

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).

+18

Masz funkcję zwracającą funkcję "volatile int", a nie zmienną. – ildjarn

+2

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 –

+0

Spójrz na http://www.drdobbs.com/cpp/volatile-the-mithithreaded-programmers-b/184403766 – user1929959

Odpowiedz

20

W kodzie, słowo volatile nie stosuje się do funkcji, ale do zwracanego typu, jest to równoznaczne z:

typedef volatile int Type; 
Type foo(); 

Teraz w C++ można zrobić członek funkcję volatile w taki sam sposób, że const kwalifikator, a zachowanie jest taka sama:

struct test { 
    void vfunction() volatile; 
}; 

Zasadniczo nie można nazwać nieulotną (alterantively non-const) funkcji w instancja volatile (odpowiednio) typu:

struct test { 
    void vfunction() volatile; 
    void function(); 
}; 
volatile test t; 
t.vfunction();  // ok 
t.function();  // error 
4

foo() nie jest niestabilna. Ta funkcja zwraca nazwę volatile int.

Co jest legalne. Ale dziwne, że powrócił int.

Z drugiej strony funkcje użytkownika mogą być volatile z tego samego powodu, z jakiego mogą być const.

+1

+1, specjalnie dla komentarza * Ale dziwne dla zwróconego 'int' *. W rzeczywistości kompilator może swobodnie upuszczać kwalifikator 'volatile' ze zwróconego obiektu. –