-
1. Data: 2009-02-10 19:47:56
Temat: Odczyt z rejestru w C
Od: Paweł <p...@n...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 ?
Paweł
-
2. Data: 2009-02-10 20:11:22
Temat: Re: Odczyt z rejestru w C
Od: Grzegorz Kurczyk <g...@c...usun.slupsk.pl>
Użytkownik Paweł napisał:
> 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
-
3. Data: 2009-02-10 23:04:47
Temat: Re: Odczyt z rejestru w C
Od: "PcmOL" <...@...net>
"Paweł" <p...@n...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 ?
>
> Paweł
Według mnie porównanie nastapi wielokrotnie.
Może wygodniej byłoby:
switch (rejest){
case 1:
break;
case 2:
.....
}
-
4. Data: 2009-02-10 23:33:53
Temat: Re: Odczyt z rejestru w C
Od: "zbyszek" <z...@o...eu>
> 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
-
5. Data: 2009-02-11 01:21:00
Temat: Re: Odczyt z rejestru w C
Od: "Pszemol" <P...@P...com>
"PcmOL" <...@...net> wrote in message news:gmt16t$gdg$1@news.task.gda.pl...
> "Paweł" <p...@n...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?
-
6. Data: 2009-02-11 01:39:00
Temat: Re: Odczyt z rejestru w C
Od: g...@n...invalid (Adam Wysocki)
Paweł <p...@n...pl> wrote:
> 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ć.
> Jak to będzie w przypadku instrukcji switch ?
Zawsze tylko raz.
--
http://www.extreme-photo.pl/
-
7. Data: 2009-02-11 14:13:00
Temat: Re: Odczyt z rejestru w C
Od: Grzegorz Kurczyk <g...@c...slupsk.pl>
Użytkownik Pszemol napisał:
>> 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
-
8. Data: 2009-02-11 15:43:12
Temat: Re: Odczyt z rejestru w C
Od: "T.M.F." <t...@n...mp.pl>
> 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.
-
9. Data: 2009-02-11 23:45:07
Temat: Re: Odczyt z rejestru w C
Od: "Artur M. Piwko" <m...@b...pl>
In the darkest hour on Wed, 11 Feb 2009 15:13:00 +0100,
Grzegorz Kurczyk <g...@c...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.
--
[ 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
-
10. Data: 2009-02-12 08:18:36
Temat: Re: Odczyt z rejestru w C
Od: J.F. <j...@p...onet.pl>
On Thu, 12 Feb 2009 00:45:07 +0100, Artur M. Piwko wrote:
>In the darkest hour on Wed, 11 Feb 2009 15:13:00 +0100,
>Grzegorz Kurczyk <g...@c...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.