Azarien napisał(a)
[...]
Przeprowadzałem niedawno testy, i na przykład wydaje mi się, że GCC całkowicie ignoruje słowo inline: przy wyłączonej optymalizacji nie inline'uje niczego, a przy włączonej inline'uje agresywnie wszystko co popadnie.
i to jest prawidłowe, bo to tylko podpowiedź, a kompilator ma prawo zrobić z tym co chce...
np. visual ma jeszcze swoje _forceinline, ono już chyba zawsze inlineuje jeśli się da, a jeśli nie (np z powodu: PROCPTR ptr = &proc;) generuje ostrzeżenie, aczkolwiek nie jestem pewny...
w każdym razie co się tyczy wydajności, to wszystko zależy od złożoności funkcji, dajmy na to, że funkcja wygląda tak:
void fun() { var = 1; }
no to załóżmy że będzie rozwinięta do 1 mov'a, no to narzut jaki będzie miało rozwinięcie funkcji będzie nieporównywalnie większy do jej treści, natomiast jeśli funkcja jest długa, to oczywiste że narzut wywołania jest nieproporcjonalnie malutki - nieznaczący, aczkolwiek zawsze jest.
Przykładowo kiedyś implementowałem swoją bibliotekę do macierzy zastępując D3DXMATRIX i metody do operacji na niej, na własne metody. Metody te nie są inline, a ja zastąpiłem je odpowiednikami inline, zysk jest rzędu mniejszego niż 1%, ale np. przy dużej ilości macierzy może już pójść w milisekundy :>
dodatkowo potem sprawdziłem jaka różnica jest przy zwracaniu wyniku w wersji:
Matrix operator*(Matrix&, Matrix&);
a
void operator*(Matrix& out, Matrix&, Matrix&);
i przekopiowanie przez też return daje podobny narzut do co wołanie func :> więc pisząc najoptymalniejszą wersję, może da się już przekroczyć 1% :D