Moim zdaniem ... "ładny" kwiatek
nie wiem czy pierwotnie był to jakiś kod na PC czy może na ARM ... nie wiem jak tam się to kompiluje do ASM i pewnie też nie w każdym przypadku tak samo bo zależnie od kontekstu tego co jest obok w programie .... nie mniej jednak dzięki takim "KWIATKOM" wielu ludzi albo nie lubi języka C albo bardzo długo nie może go zaskoczyć
... sam tak miałem ... gdy kiedyś dawno temu na ele... zapytałem o jakąś tego typu operację na wskaźnikach i wpadł pewien gości wpisał właśnie coś w tym stylu ... czyli sporo nawiasów, gwiazdek, typów hahaha
i powiedział krótko - "tak możesz to zrobić" bez dodatkowego słowa wyjaśnienia a próby dopytania go o jakieś detale spełzały na niczym. Później kilka innych osób próbowało rozgryzać ten kod - ba nawet uznali że fajny bo powinien działać ... aż po jakimś czasie jak to na forum, wpadł jeszcze ktoś, kto pokazał że tam jest mały błąd i to nie będzie działać - wyjaśnił gdzie błąd ale nie podał alternatywnego rozwiązania. Ja oczywiście wtedy patrzyłem na to wszystko jak SROKA W KOŚĆ, i tak z kodu nawet nie próbowałem skorzystać bo kompletnie nie wiedziałem o co chodzi ... przez te gwiazdki, ptaszki, krzaczki ...
Tutaj .... hmmm owszem
potraktowałbym to jako fajną zagadkę/łamigłówkę (wręcz na jakiś konkurs dla początkujących ambitnych osób, które starają się uczyć bardziej zaawansowanych działań na wskaźnikach) bo do tego ten przykład się chyba naprawdę fajnie nadaje. Więc jeśli masz panie kolego mokrowski jeszcze więcej takich kwiatków (sadzonek) to pokaż
Po co tyle o tym piszę ? .. bo w AVR GCC praktycznie prawie nie będzie różnicy pomiędzy kwiatkiem /* Fast copy */ czyli:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
a alternatywnym i myślę, że dużo bardziej przejrzystym hmm normalnym kopiowaniem:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
dzięki któremu na dodatek możemy kopiować równie szybko dowolną ilość bajtów a nie tylko taką narzuconą przez rozmiar typu
Ale też wiadomo, że czasem w pewnych kontekstach kompilacji AVR GCC zoptymalizuje tu nieco lepiej kod i oszczędzi nam czasem kilka bajtów Flash a co za tym idzie i na szybkości pewnie zyskamy kilkanaście taktów zegara .... Będzie jednak też tak czasem, że np w ogóle nie zaoszczędzi ... poniżej przykład jak w ASM realizowane są czasem takie dwa różne sposoby - (asembler z pliku *.lss po końpilacji) To oczywiście bzdurny przykład - bo w pustym main.c tylko taka jedna linijka na dwa sposoby - ale pokaże to jak się generuje czasem kod i że różnie dla dwóch sposobów:
najpierw /* Fast copy
*/
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
a teraz ten z memcpy()
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Jak widać - mała kosmetyczna zmiana w ASM i tutaj akurat oba sposoby nie różnią się zajętością Flash (ale zaznaczam to taki prymitywny i tylko obrazowy przykład)
ale właśnie czy pisząc normalny kod w C potrzebne nam jest kilkanaście taktów zegara ?
... No zaraz znajdą się ludzie co powiedzą, że tak - sam nawet bym powiedział, że gdyby chcieć coś robić w przerwaniu, gdzie zależy nam akurat na każdym takcie zegara ... to niby ok ? Choć tu też trzeba wziąć pod uwagę to, że kompilator i przy zmianach z wersji na wersję, i w zależności od kontekstu kodu może dawać różne wyniki jeśli chodzi o tą oszczędność taktów, zatem raz może to być oszczędność (strzelam) 8 taktów innym razem 12 taktów. A to już może i często tak jest że nawet w nieświadomy sposób dla osoby, która nie zna takich zależności ... spowoduje niejednokrotnie więcej kłopotów niż korzyści ....
Pomijam już to o co zwykle staramy się dbać w kodzie - czyli jego czytelność ..... i przejrzystość ...
Ale to tylko takie moje luźne uwagi