Kurz und schnell: Inline-Funktionen

Willemers Informatik-Ecke

Diese Seite basiert auf Inhalten aus meinem Buch "Einstieg in C++", seinerzeit erschienen im Verlag Galileo Computing. Das Buch ist inzwischen vergriffen.


Das Nachfolgebuch heißt C++. Der Einstieg und ist bei Wrox im Verlag Wiley-VCH erschienen.

Die Inhalte dieser Website unterliegen meinem Urheberrecht und dürfen trotz inhaltlicher Überschneidungen mit dem Buch dank der freundlichen Genehmigung des Verlags Wiley-VCH hier erscheinen.

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.


Informatik-Ecke Einstieg in C++ (C) Copyright 2005 Arnold Willemer