dziobak7 napisał(a):
No i źle zrozumiałeś. Optymalizacja kompilatora ma się nijak do pracy preprocesora (a o niego pytałeś).
paw_kakol1 napisał(a):
Witam, chciałbym się dowiedzieć czy preprocesor lub kompilator (jeżeli tak to na jakim poziomie optymalizacji) wykonuje oczywiste działania, w celu wyręczenia procesora?
Wydaje mi się, że autor wątku nie pytał tylko o preprocesor.
Rozpatrując przykład z pierwszego postu:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Zgodnie z tym, co przeczytałeś w książce, czy też z tym, co napisali koledzy powyżej, preprocesor niczego nie liczy, tylko w miejscu wystąpienia słowa zdefiniowanego dyrektywą
#define podstawia wartość mu przypisaną. Podczas budowania programu w pierwszej kolejności plik zostanie poddany działaniu preprocesora i w jego wyniku powstanie kod mniej więcej taki:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Kod w takiej postaci zostaje przekazany do kompilatora. Kompilator obliczy sobie jednak sumę i potraktuje ten kod jako:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Wszelkie takie obliczenia na literałach liczbowych (nawet dużo bardziej skomplikowane), których wartość jest znana podczas kompilacji, będą obliczone przez kompilator zapewne nawet przy wyłączonej optymalizacji. W takim przypadku nie obawiałbym się, że procesor docelowy będzie musiał liczyć sumę 5+7. Zasada ta dotyczy oczywiście nie tylko operacji arytmetycznych, ale także logicznych.
Niepewna może być inna sytuacja:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Jeżeli zmienna
liczba_b nie jest zdefiniowana jako
volatile, została jej przypisana wartość znana na etapie kompilacji i kompilator wykryje, że pomiędzy przypisaniem tej wartości a użyciem zmiennej nie ma instrukcji przypisujących jej inną (nieznaną w trakcie kompilacji) wartość, to kompilator może w trakcie kompilacji potraktować wyrażenie
uint8_t liczba = LICZBA_A + liczba_b; jako
uint8_t liczba = 12;. W tym przypadku jednak
może, ale
nie musi. Przy wyłączonej optymalizacji najprawdopodobniej przekaże obliczenie wartości zmiennej
liczba do procesora docelowego. Jest jednak prawdopodobne, że już przy poziomie optymalizacji
-O1 obliczy sumę samodzielnie.
Kompilator potrafi nawet w dużo bardziej zawiłych sytuacjach znaleźć okazję do przeniesienia zbędnych obliczeń do etapu kompilacji, odciążając w ten sposób procesor docelowy. Poza tym optymalizacja polega nie tylko na obliczaniu wartości stałych- jest wiele metod optymalizacji. Trzeba jednak pamiętać, że w celu napisania wydajnego kodu, samo bazowanie na zdolnościach optymalizacyjnych kompilatora nie zawsze wystarczy. Z drugiej strony znajomość zasad optymalizacji na pewno pomaga.
Ogólny opis:
https://pl.wikipedia.org/wiki/Optymalizacja_kodu_wynikowego