Odczyt z rejestru w C

Witam !

Mam chyba banalne pytanie dotyczące działania kompilatorów. Jeśli C mam sprawdzanie wartości rejestru uP np. w następujący sposób: if (rejestr==1) ... else if (rejestr==2) ... eles if (rejestr==3) .... to w praktyce wartość z rejestru będzie odczytana jeden raz czy kilka razy ?. Jak to będzie w przypadku instrukcji switch ?

Paweł

Reply to
Paweł
Loading thread data ...

Użytkownik Paweł napisał:

Najprościej sprawdzić co wypluje kompilator w asm-ie. W przypadku gdy zmienna "rejestr" będzie zadeklarowana jako volatile, to dla ciągu instrukcji if będzie ona odczytana za każdym razem. Bez volatile kompilator prawdopodobnie zoptymalizuje kod do pojedynczego odczytu. Co do switch to chyba nawet przy volatile odczyt nastąpi tylko raz.

Pozdrawiam Grzegorz

Reply to
Grzegorz Kurczyk

Jeżeli rejestr jest volatile (powinien być) to kilka razy. Jeżeli nie jest, to nie jest określone (zależy od optymalizacji) i nie można niczego założyć.

Zawsze tylko raz.

Reply to
Adam Wysocki

Użytkownik Pszemol napisał:

Porównanie będzie wielokrotne, bo musi. Tylko że w sekcji switch zmienna "rejest" zostanie pobrana z pamięci do jednego z rejestrów procesora i dalsze porównania przeprowadzone będą na tym rejestrze. W sumie ma to znaczenie tylko w przypadku gdy do zmiennej "rejest" mają dostęp kilka wątków.

Pozdrawiam Grzegorz

Reply to
Grzegorz Kurczyk

Tez nie bylbym taki pewien. Wszystko zalezy jak to potraktuje optymalizator i jak masz zapisane sekcje, np.: switch (rej) { case 1 : costam; break; case 2 : costam; case 3 : costam; };

Po pierwszej sekcji nastepuje koniec sprawdzania, natomiast przy 2 po jej zakonczeniu przechodzi do warunku nr 3, co moze wiazac sie z ponownym odczytem zmiennej rej. Dodatkowo kompilator jesli jest wiecej case moze zrobic z tego jump table, zamiast sekwencji porownan. Zeby miec pewnosc w przypadku zmiennych, ktorych wartosc moze sie zmieniac pomiedzy porownaniami obowiazkowo trzeba je definiowac jako volatile, inaczej to co zrobi kompilator zalezy od optymalizacji i zadne zalozenia nie sa gwarantowane.

Reply to
T.M.F.

In the darkest hour on Wed, 11 Feb 2009 15:13:00 +0100, Grzegorz Kurczyk snipped-for-privacy@control.slupsk.pl> screamed:

Nie musi. Jeśli case-ów będzie dużo, to zostanie stworzona tablica skoków.

Reply to
Artur M. Piwko

pod warunkiem ze sa one kolejne, a w ogolnosci nie musza. kompilator ma dowolnosc, niektore potrafia chyba nawet wygenerowac drzewo binarne. No i z tym przeladowaniem do rejestru procesora to zasadniczo tez niekoniecznie, bo moze sie wydawac kompilatorowi ze to nieoplacalne.

J.

Reply to
J.F.

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.