Dlaczego używamy słowa kluczowego volatile w C++? [duplikat]
Możliwy duplikat:
C++: Kiedy pomogło ci słowo kluczowe volatile?
Nigdy go nie używałem, ale zastanawiam się, dlaczego ludzie go używają? Co dokładnie robi? Przeszukałem forum, znalazłem tylko tematy C # lub Java.
2 answers
Rozważ ten kod,
int some_int = 100;
while(some_int == 100)
{
//your code
}
Kiedy ten program zostanie skompilowany, kompilator może zoptymalizować ten kod, jeśli stwierdzi, że program nigdy nigdy nie podejmie żadnej próby zmiany wartości some_int
, więc może pokusić się o optymalizację pętli while
zmieniając ją z while(some_int == 100)
na po prostu while(true)
, aby wykonanie było szybkie (ponieważ warunek w pętli while
wydaje się być zawsze true
). (jeśli kompilator go nie optymalizuje, to musi pobrać wartość some_int
(jeśli nie jest załadowany do rejestru) i porównać go z 100, za każdym razem, co oczywiście jest trochę powolny.)
Czasami jednak optymalizacja (niektórych części programu) może być niepożądana , ponieważ może być tak, że ktoś inny zmienia wartość some_int
z poza programem, którego kompilator nie jest świadomy, ponieważ nie może jej zobaczyć; ale tak ją zaprojektowałeś. W takim przypadku optymalizacja kompilatora spowodowałaby , a nie wytworzenie pożądanego wynik!
Tak więc, aby zapewnić pożądany rezultat, musisz jakoś powstrzymać kompilator przed optymalizacją pętli while
. W tym miejscu swoją rolę odgrywa słowo kluczowe volatile
. Wszystko, co musisz zrobić, to:
volatile int some_int = 100; //note the 'volatile' qualifier now!
Innymi słowy wyjaśniłbym to w następujący sposób:
volatile
mówi kompilatorowi, że
"Hej kompilatorze, jestem Lotny, a Ty wiem, że może mnie zmienić jakiś XYZ nawet o tym nie wiesz. Że XYZ może być wszystkim. Może jakieś / align = "left" / program. Może jakieś oświetlenie, jakieś forma przerwania, itp. może zmutuj mnie. Może. Nigdy nie wiadomo kto zmieni mnie! So O you ignorancie, przestań udawać wszechwiedzącego Boże i nie waż się dotykać kodu gdzie jestem obecny. Dobrze?"
W ten sposób volatile
uniemożliwia kompilatorowi optymalizację kodu. Teraz google go zobaczyć kilka przykładowych przykładów.
Cytowanie ze standardu C++ ($7.1.5.1/8)
[..] Lotny jest podpowiedzią do wdrożenie do unikania agresywnego optymalizacja z udziałem obiektu ponieważ wartość obiektu może być zmieniane w sposób niewykrywalny przez wdrożenie.[...]
Tematy pokrewne:
Czy stworzenie struktury niestabilnej sprawia, że wszyscy jej członkowie są niestabilni?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-16 04:26:44
W programowaniu komputerowym, szczególnie w językach programowania C, C++ i C#, zmienna lub obiekt zadeklarowany za pomocą słowa kluczowego volatile
zwykle ma specjalne właściwości związane z optymalizacją i / lub wątkiem. Ogólnie rzecz biorąc, słowo kluczowe volatile
ma na celu uniemożliwienie kompilatorowi (pseudo)stosowania optymalizacji w kodzie, które zakładają, że wartości zmiennych nie mogą się same zmienić."(c) Wikipedia
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-11 22:33:24