Der Aufruf einer Funktion benötigt eine gewisse Zeit. Die Rücksprungadresse
wird auf den Stack gelegt. Die Parameter werden ebenfalls auf den Stack gelegt.
Die Funktion
wird angesprungen. Die Parameter werden nach dem Ablauf der Funktion wieder
freigegeben, und das Programm springt zum Ausgangspunkt zurück. Auch wenn sich
dies alles langwierig anhört, benötigt der Aufruf einer Funktion nur einen
geringen Teil der Laufzeit eines Programms und fällt normalerweise nicht ins
Gewicht.
In zeitkritischen Anwendungen aber kann der Aufruf einer Funktion bereits
zu viel Zeit in Anspruch nehmen.
Um dies zu vermeiden, kann einer Funktion das Attribut inline
vorangestellt werden.
Hier wird der Compiler die Anweisungen nicht als Funktion aufrufen, sondern
an die Stelle des Funktionsaufrufs jeweils den Funktionsinhalt
kopieren.
Stellt der Compiler fest, dass eine solche Ersetzung keine Laufzeitvorteile
bringt, steht es ihm frei, die Inline-Funktion so zu übersetzen, dass sie
wie jede andere Funktion aufgerufen wird.
[Inline-Funktion (inline.cpp)]
#include <iostream>
using namespace std;
inline int min(int a, int b)
{
return a<b ? a : b;
}
int main()
{
cout << min(4, 3) << endl;
cout << min(3, 4) << endl;
}
Im Beispiel wird die Minimum-Funktion nicht als Funktion ausgeführt, sondern
in der Form, dass der Code der Funktion direkt an der Aufrufstelle eingefügt
wird. Dadurch sparen Sie einen Sprung zur Funktion, das Kopieren der Parameter
auf den Stack und den Rücksprung. Der übersetzte Code würde also so aussehen,
als würde er direkt an der Aufrufstelle stehen.
[Umsetzung]
#include <iostream>
using namespace std;
int main()
{
cout << 4<3 ? 4 : 3 << endl;
cout << 3<4 ? 3 : 4 << endl;
}
Sie haben bei einer Inline-Funktion sämtliche Vorteile einer Funktion und
gewinnen Geschwindigkeitsvorteile hinzu. Der Ersetzungsmechanismus vergrößert
natürlich das Programm. Wenn die Funktion aber nicht besonders groß ist,
fällt das nicht ins Gewicht.