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