eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronika › Odczyt z rejestru w C
Ilość wypowiedzi w tym wątku: 11

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


strony : [ 1 ] . 2


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: