10
ROZDZIAŁ 7. ZMIENNE
volatile znaczy ulotny. Oznacza to, żc kompilator wyłączy dla takiej zmiennej optymalizacje typu zastąpienia przez stalą lub zawartość rejestru, za to wygeneruje kod, który będzie odwoływał się zawsze do komórek pamięci danego obiektu. Zapobiegnie to błędowi, gdy obiekt zostaje zmieniony przez część programu, która nk* ma zauważalnego dla kompilatora związku z danym fragmentem kodu lub nawet przez zupełnie inny proces.
volatile float liczbal; float liczba2;
{
printf ("%d\n%d", liczbal, liczba2);
/* instrukcje nie związane ze zmiennymi */ printf ("ŹCdNniid", liczbal, liczba2);
>
Jeżeli zmienne liczbal i liczba2 zmienią się niezauważalnie dla kompilatora to odczyt tyąc :
• liczbal - nastąpi odwołanie do komórek pamięci. Kompilator pobierze nową wartość zmiennej.
• Iiczlm2 kompilator może wypisać poprzednią wartość, którą przechowywał w rejestrze.
Modyfikator volatile jest rzadko stosowany i przydaje się w wąskich zastosowaniach, jak współbieżność i współdzielenie zasobów oraz przerwania systemowe.
Jeżeli utworzymy zmienną, której będziemy używać w swoim programie bardzo często, możemy wykorzystać modyfikator register. Kompilator może wtedy umieścić zmienną w rejestrze, do którego ma szybki dostęp, co przyśpieszy odwołania do tej zmiennej
register int liczba ;
W nowoczesnych kompilatorach ten modyfikator praktycznie nie ma wpływu na program. Optymalizator sam decyduje czy i co należy umieścić w rejestrze. Nie mamy żadnej gwarancji, żc zmienna tak zadeklarowana rzeczywiście się tam znajdzie, chociaż dostęp do niej może zostać przyspieszony w inny sposób. Raczej powinno się unikać tego typu konstrukcji w programie.
Pozwala na zdefiniowanie zmiennej statycznej. “Statyczność” polega na zacłiowaniu wartości pomiędzy kolejnymi definicjami tej samej zmiennej. Jest to przede wszystkim przydatne w funkcjach. Gdy zdefiniujemy zmienną w ciele funkcji, to zmienna ta będzie od nowa definiowana wraz z domyślną wartością (jeżeli taką podano). W wypadku zmiennej określonej jako statyczna, jej wartość się nk* zmieni przy ponownym wywołaniu funkcji. Na przykład: