RTV forum PL | NewsGroups PL

Odczyt wartości rejestru w C ile razy jest sprawdzany w instrukcjach if i switch?

Odczyt z rejestru w C

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Odczyt wartości rejestru w C ile razy jest sprawdzany w instrukcjach if i switch?

Paweł
Guest

Tue Feb 10, 2009 8:47 pm   



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ł

Grzegorz Kurczyk
Guest

Tue Feb 10, 2009 9:11 pm   



Użytkownik Paweł napisał:
Quote:
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ł

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

PcmOL
Guest

Wed Feb 11, 2009 12:04 am   



"Paweł" <pawel.neo@neostrada.pl> wrote in message
news:gmslov$n28$1@atlantis.news.neostrada.pl...
Quote:
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ł

Według mnie porównanie nastapi wielokrotnie.
Może wygodniej byłoby:

switch (rejest){
case 1:
break;
case 2:
.....
}

zbyszek
Guest

Wed Feb 11, 2009 12:33 am   



Quote:
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 ?

Zacznij od tego ile razy chcesz go odczytać. Jesli raz to zapisz tymczasowo
w zmiennej
lokalnej i będziesz miał spokój.

Co do ogólności C to wszystko zależy od zasobów procesora, wersji
kompilatora
i włączenia optymalizacji kodu (szybkość/zajętość). Inaczej może być za
każdym razem.


zbyszek

Pszemol
Guest

Wed Feb 11, 2009 2:21 am   



"PcmOL" <A@A.net> wrote in message news:gmt16t$gdg$1@news.task.gda.pl...
Quote:
"Paweł" <pawel.neo@neostrada.pl> wrote in message
news:gmslov$n28$1@atlantis.news.neostrada.pl...
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 ?

Według mnie porównanie nastapi wielokrotnie.
Może wygodniej byłoby:

switch (rejest){
case 1:
break;
case 2:
.....
}

Sugerujesz może, że wtedy porównanie nastąpi jednokrotnie?

Adam Wysocki
Guest

Wed Feb 11, 2009 2:45 am   



Paweł <pawel.neo@neostrada.pl> wrote:

Quote:
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 ?.

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ć.

Quote:
Jak to będzie w przypadku instrukcji switch ?

Zawsze tylko raz.

--
http://www.extreme-photo.pl/

Grzegorz Kurczyk
Guest

Wed Feb 11, 2009 3:13 pm   



Użytkownik Pszemol napisał:
Quote:
switch (rejest){
case 1:
break;
case 2:
.....
}

Sugerujesz może, że wtedy porównanie nastąpi jednokrotnie?

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

T.M.F.
Guest

Wed Feb 11, 2009 4:43 pm   



Quote:
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ć.

Jak to będzie w przypadku instrukcji switch ?

Zawsze tylko raz.

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.

Artur M. Piwko
Guest

Thu Feb 12, 2009 12:45 am   



In the darkest hour on Wed, 11 Feb 2009 15:13:00 +0100,
Grzegorz Kurczyk <grzegorz.usun.to@control.slupsk.pl> screamed:
Quote:
switch (rejest){
case 1:
break;
case 2:
.....
}

Sugerujesz może, że wtedy porównanie nastąpi jednokrotnie?

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.

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

--
[ Artur M. Piwko : Pipen : AMP29-RIPE : RLU:100918 : From == Trap! : SIG:237B ]
[ 00:44:33 user up 11981 days, 12:39, 1 user, load average: 0.24, 0.18, 0.68 ]

Where there is no patrol car, there is no speed limit. -- Peter Beckmann

J.F.
Guest

Thu Feb 12, 2009 9:18 am   



On Thu, 12 Feb 2009 00:45:07 +0100, Artur M. Piwko wrote:
Quote:
In the darkest hour on Wed, 11 Feb 2009 15:13:00 +0100,
Grzegorz Kurczyk <grzegorz.usun.to@control.slupsk.pl> screamed:
switch (rejest){
case 1:
break;
case 2:
.....
}
Sugerujesz może, że wtedy porównanie nastąpi jednokrotnie?
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.

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

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.

Pszemol
Guest

Thu Feb 12, 2009 6:25 pm   



"J.F." <jfox_xnospamx@poczta.onet.pl> wrote in message
news:amm7p49jrpsivgrvflakvkbogq5qqvgpm5@4ax.com...
Quote:
No i z tym przeladowaniem do rejestru procesora to zasadniczo tez
niekoniecznie, bo moze sie wydawac kompilatorowi ze to nieoplacalne.

I wtedy test tego oryginalnego rejestru nastąpi wiele razy...

elektroda NewsGroups Forum Index - Elektronika Polska - Odczyt wartości rejestru w C ile razy jest sprawdzany w instrukcjach if i switch?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map