• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Co to jest "volatile"?

Object Storage Arubacloud
+2 głosów
13,491 wizyt
pytanie zadane 16 sierpnia 2015 w C i C++ przez Rogulix Obywatel (1,850 p.)
Zaciekwiła mnie sprawa specyfikatora Volatile w C++. Czy ktoś może wie w jakich sytuacjach się tego używa i czy jest to przydatne do czegoś?

5 odpowiedzi

+3 głosów
odpowiedź 16 sierpnia 2015 przez adrian17 Ekspert (344,860 p.)
edycja 16 sierpnia 2015 przez adrian17
 
Najlepsza

Inni podali definicję, ja zastosowanie:  na pecetach przy normalnym programowaniu, praktycznie nigdy. Jedyne przyjęte sensowne zastosowania volatile są, gdy:

  • gdy pamięć jest zmapowana (na przykład do rejestrów w mikrokontrolerach) i chcemy się upewnić że kompilator nie uprości jakiś cyklów dostępu/zapisu do pamięci.
  • również w mikrokontrolerach, gdy chcemy mieć zmienną globalną dostępną dla funkcji obsługujących przerwania (bo kompilator nie spodziewa się, że kiedykolwiek te funkcje zostaną wykonane).
  • wykonywane są duże skoki z użyciem funkcji longjmp()
  • w obsłudze sygnałów (patrz nagłówek <csignal>)

Przy czym dwa pierwsze dość szybko się napotka jeśli robisz coś z mikrokontrolerami, a dwa ostatnie tylko jeśli robisz coś naprawdę bardzo niskopoziomowego.

(jak ktoś chce to mogę dać praktyczne przykłady dwóch pierwszych)

komentarz 16 sierpnia 2015 przez Szykem2 Nałogowiec (29,510 p.)
Dorzuciłbym do listy jeszcze programowanie wielowątkowych aplikacji. W sensie, że wszystkie wspólne dla wszystkich wątków zmienne powinny być volatile.
1
komentarz 16 sierpnia 2015 przez adrian17 Ekspert (344,860 p.)
edycja 16 sierpnia 2015 przez adrian17
NIE. Volatile ma takie zastosowanie w Javie, ale używanie go w ten sposób w C++ to placebo (choć teoretycznie jest lepszy niż brak jakiegokolwiek zabezpieczenia). Najbliższym odpowiednikiem volatile z Javy jest std::atomic z C++11. Lektura:

https://www.securecoding.cert.org/confluence/display/cplusplus/CON01-CPP.+Do+not+use+volatile+as+a+synchronization+primitive

https://stackoverflow.com/questions/4557979/when-to-use-volatile-with-multi-threading/4558031#4558031

https://software.intel.com/en-us/blogs/2007/11/30/volatile-almost-useless-for-multi-threaded-programming
komentarz 16 sierpnia 2015 przez Szykem2 Nałogowiec (29,510 p.)
Dzięki za info :) mój wykładowca jednak mówił, że przy wielowątkowym się stosuje volatile, ale dopiero w tym semestrze będziemy o tym mówić szerzej to pewnie doda, że lepiej używać innych elementów. Z chęcią poczytam sobie to co podesłałeś:)
komentarz 16 sierpnia 2015 przez adrian17 Ekspert (344,860 p.)

Wykładowcy często uczą rzeczy, których sami nauczyli się dawno lub ze słabych źródeł. Na wypadek gdybyś chciał się z nim kłócić, polecam:

  • Jako dowód książkowy: "Effective Modern C++" Scotta Meyersa, rozdział 40
  • Prosty przykład w którym volatile ewidentnie nie synchronizuje się poprawnie, a std::atomic tak: http://pastebin.com/iyjXe2Jf
+1 głos
odpowiedź 16 sierpnia 2015 przez Dorion300 Szeryf (90,250 p.)

volatile (z ang. zmienny, ulotny ) w C++ jest kwalifikatorem typu informującym kompilator, ze wartość zmiennej może się zmienić "za jego plecami", bez jego wiedzy i kontroli i że w związku z tym kompilator powinien zrezygnować z agresywnej optymalizacji i przy każdym odwołaniu do tej zmiennej wczytać nową wartość z komórki pamięci. Może byc zastosowany do metod, składowych i samych obiektów. Na rzecz obiektu volatile można wywołać tylko metodę oznaczoną jako volatile!

+1 głos
odpowiedź 16 sierpnia 2015 przez niezalogowany
O ile wiem, jest to przydomek, który powiadamia kompilator o tym, że zmienna z tym przydomkiem jest zmienna, w sensie, że się ciągle zmienia (volatile - ulotny, zmienny), np. czujnik temperatury. Tworzysz nową zmienną np. int temp i ustawiasz ją na jakieś urządzenie zewnętrzne, czyli jakiś termometr na ten przykład. No i temperatura ciągle się zmienia, więc zmienna też się ciągle zmienia w czsie rzeczywistym. Tak to jest, bo wiem, ale nigdy tego nie próbowałem, więc przekazuję ci tylko wiedzę teoretyczną ;)
+1 głos
odpowiedź 16 sierpnia 2015 przez Szykem2 Nałogowiec (29,510 p.)
Volatile polega na tym, że kompilator nie umieszcza wartości na stosie, tylko za każdym razem odczytuje z urządzenia, do którego zmienna jest podpięta. Np. jakiś czujnik zewnętrzny.
0 głosów
odpowiedź 16 sierpnia 2015 przez mrcnsct Nałogowiec (36,390 p.)

Dla zmiennej typu volatile kompilator wyłącza optymalizację http://mirekk36.blogspot.com/2011/08/test.html

Podobne pytania

+1 głos
3 odpowiedzi 417 wizyt
pytanie zadane 9 lipca 2018 w Java przez Tomasz Rogalski Bywalec (2,800 p.)
+4 głosów
1 odpowiedź 4,456 wizyt
pytanie zadane 25 czerwca 2015 w Java przez Jaskrowicz Obywatel (1,210 p.)
0 głosów
0 odpowiedzi 635 wizyt
pytanie zadane 4 stycznia 2022 w C i C++ przez fightforyourlive777 Nowicjusz (160 p.)

92,579 zapytań

141,432 odpowiedzi

319,662 komentarzy

61,963 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...