Funkcje inline w c++

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.

Komentarze