Mając fragment kodu, który koniecznie chcemy zapisać w funkcji, warto zastanowić się czy jest to najbardziej optymalne rozwiązanie. Na przykład: krótka funkcja podwajająca wartość argumentu. Pisząc zwykłą funkcję:
int podwoj(int a)
return 2 * a;
tracimy mnóstwo czasu. Spójrzmy na to z niższego poziomu. Po wywołaniu funkcji podwoj() z np. funkcji main na stos zostają odłożone różne wartości(by stworzyć tzw. ramkę stosu). A te różne wartości to: argumenty funkcji wywoływanej w odwrotnej kolejności(FILO stosu), adres powrotu i wskaźnik ramki stosu.
Gdy dojdzie do wywołania asemblerowej instrukcji call na stos zostaje odłożony adres powrotny, później następuje przeskok na początek funkcji podwoj(). Dalej, w uproszczeniu: wykonanie funkcji podwoj() i skok z powrotem(pod miejsce wywołania).
Gdy takich funkcji wywołujemy wiele to też wiele tracimy na czasie wykonania(oszczędzając nieco pamięci). Aby temu zapobiec można wykorzystać makra z języka c ale lepiej użyć funkcji inline. To o czym należy pamiętać to słowo kluczowe inline przed deklaracją i definicją; wywołanie "jest normalne".
Funkcja podwoj() zapisana jako inline:
inline int podwoj(int a) { return 2 * a; }
Dla porównania makro podwoj():
#define PODWOJ(A) ((2) * (A))
Istotną zaletą funkcji inline nad makrami z c jest fakt że parametry przekazuje się przez wartość, jak w zwykłych funkcjach. W makrach jest to operacja na pliku tekstowym. W przypadku inline kompilator zastępuje każde wywołanie funkcji całym jej kodem.(10 wywołań i plik może się nieźle zwiększyć) Wykorzystywanie funkcji inline w "celach optymalizacyjnych" jest zazwyczaj dobre jeżeli czas skoku do funkcji jest znaczącym czasem na tle całej procedury.
int podwoj(int a)
return 2 * a;
tracimy mnóstwo czasu. Spójrzmy na to z niższego poziomu. Po wywołaniu funkcji podwoj() z np. funkcji main na stos zostają odłożone różne wartości(by stworzyć tzw. ramkę stosu). A te różne wartości to: argumenty funkcji wywoływanej w odwrotnej kolejności(FILO stosu), adres powrotu i wskaźnik ramki stosu.
Gdy dojdzie do wywołania asemblerowej instrukcji call na stos zostaje odłożony adres powrotny, później następuje przeskok na początek funkcji podwoj(). Dalej, w uproszczeniu: wykonanie funkcji podwoj() i skok z powrotem(pod miejsce wywołania).
Gdy takich funkcji wywołujemy wiele to też wiele tracimy na czasie wykonania(oszczędzając nieco pamięci). Aby temu zapobiec można wykorzystać makra z języka c ale lepiej użyć funkcji inline. To o czym należy pamiętać to słowo kluczowe inline przed deklaracją i definicją; wywołanie "jest normalne".
Funkcja podwoj() zapisana jako inline:
inline int podwoj(int a) { return 2 * a; }
Dla porównania makro podwoj():
#define PODWOJ(A) ((2) * (A))
Istotną zaletą funkcji inline nad makrami z c jest fakt że parametry przekazuje się przez wartość, jak w zwykłych funkcjach. W makrach jest to operacja na pliku tekstowym. W przypadku inline kompilator zastępuje każde wywołanie funkcji całym jej kodem.(10 wywołań i plik może się nieźle zwiększyć) Wykorzystywanie funkcji inline w "celach optymalizacyjnych" jest zazwyczaj dobre jeżeli czas skoku do funkcji jest znaczącym czasem na tle całej procedury.
Komentarze
Prześlij komentarz