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.

Author: Community, 2010-12-14

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?

 901
Author: Nawaz,
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

Http://en.wikipedia.org/wiki/Volatile_variable

 11
Author: Ivan,
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