Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 29 mar 2024, o 01:30


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
Autor Wiadomość
PostNapisane: 19 sty 2019, o 16:52 
Offline
Nowy

Dołączył(a): 06 gru 2014
Posty: 2
Lokalizacja: Gdańsk
Pomógł: 0

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? W bluebook'u jest napisane, że #define to "określenie ciągu znaków, które je zastępuje". Ten zapis rozumiem jako brak wykonywania działań tylko proste podstawienie zawartości. W związku z tym, że chciałbym napisać optymalny wydajnościowo kod to chcę się upewnić co potrafi preprocesor.
Czy w poniższym przykładzie:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

procesor będzie wykonywać 1 operację: podstawienie?
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

czy może 2 opreacje: suma i podstawienie?
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 sty 2019, o 18:27 
Offline
Użytkownik

Dołączył(a): 29 paź 2017
Posty: 230
Pomógł: 26

Popatrz, napisałem cały program dodałem funkcję i masz efekt
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Kompilator ograniczył to wszystko co napisałem do dwóch linijek
W pliku z rozszerzeniem .lss
pojawił się taki zapis:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Używam Mirkowego MkClipsa i po kompilacji jest zawsze tworzony w katalogu Relase plik mojprog.lss
Nie jestem Ci w stanie odpowiedzieć jak to kompilator robi ale często zaglądam do tego pliku.

Spróbuj napisać funkcje która będzie używać zmiennej volatile i zobacz co się stanie
Prawdopodobnie w tym przypadku kompilator nie odważy się tak skrócić kodu
Po prostu nie będzie wiedział czy zmienna nie zostanie zmodyfikowana później gdzieś w przerwaniu.
W moim przypadku wywalił całe moje wypociny (fukcję ddd) i od razu do rejestru DDR wpisał wartość 42 czyli sumę dwóch zdefiniowanych wartości.


Autor postu otrzymał pochwałę

_________________
Jestem na GG 31324
Nowy soft, nowa nadzieja.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sty 2019, o 18:09 
Offline
Nowy

Dołączył(a): 06 gru 2014
Posty: 2
Lokalizacja: Gdańsk
Pomógł: 0

Dzięki za pomoc, Wasze odpowiedzi rozjaśniły mi temat i teraz wiem, że następnym razem przy niepewności po prostu skompilować obie wersje i porównać pliki .lss z katalogu Relese



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 sty 2019, o 23:10 
Offline
Użytkownik

Dołączył(a): 25 lip 2013
Posty: 2561
Pomógł: 126

Obejrzyj film Mirka o działaniu kompilatora.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 sty 2019, o 18:24 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

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:
Składnia: [ Pobierz ] [ Ukryj ]
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:
Składnia: [ Pobierz ] [ Ukryj ]
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:
Składnia: [ Pobierz ] [ Ukryj ]
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:
Składnia: [ Pobierz ] [ Ukryj ]
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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 8 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO