Inline-Ersetzung

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche
Dieser Artikel oder nachfolgende Abschnitt ist nicht hinreichend mit Belegen (beispielsweise Einzelnachweisen) ausgestattet. Die fraglichen Angaben werden daher möglicherweise demnächst entfernt. Bitte hilf der Wikipedia, indem du die Angaben recherchierst und gute Belege einfügst. Näheres ist eventuell auf der Diskussionsseite oder in der Versionsgeschichte angegeben. Bitte entferne zuletzt diese Warnmarkierung.

Die Inline-Ersetzung ist eine Optimierungstechnik von Compilern zur Steigerung der Ausführungsgeschwindigkeit eines Computerprogramms. Dabei wird der Code der aufzurufenden Funktion an Stelle des Aufrufs kopiert. Das reduziert den Mehraufwand für den Aufruf (Sichern der Register, Vorbereiten des Stack), verbessert die Lokalität und weiterhin kann bei der Optimierung der Code beider Funktionen gemeinsam berücksichtigt werden.

Beispiel[Bearbeiten]

Folgender Quelltext

inline int quadrat(int x) {
   return (x * x);
}
 
int c(int a, int b) {
   return quadrat(a) + quadrat(b);
}

… wird vom Compiler so übersetzt, dass nicht die Funktion aufgerufen wird, sondern die Funktionsdefinition direkt eingefügt wird:

int c(int a, int b) {
   return (a * a) + (b * b);
}

Inline-Ersetzung erfüllt in C++ also einen ähnlichen Zweck wie ein Makro, bietet aber zusätzlich die Sicherheit einer statischen Typprüfung wie bei Funktionen. Sie muss explizit deklariert werden und kann für von Klassen unabhängige, wie auch für Elementfunktionen (Methoden) verwendet werden. In den Interna des Compilers sind Makros und Inline-Ersetzungen jedoch nicht zu vergleichen.

Es ist für den Compiler aber nicht für jede beliebig komplizierte Funktion möglich, die vom Programmierer gewünschte Ersetzung auch durchzuführen. Dann wird der normale Funktionsaufruf beibehalten. Vielmehr ist das inline im Beispiel als Empfehlung an den Compiler zu sehen, der er aber nicht nachgehen muss. Speziell in C++ gibt es für Ausnahmefälle auch Compiler-spezifische stärkere Varianten von inline (wie z. B. __forceinline), deren Einsatz jedoch auf Kosten der Portabilität gehen kann. Ohne solche Varianten wird das Inline-Attribut jedoch von den meisten modernen Compiler zumindest bei hohen Optimierungsleveln ignoriert.

Manche Compiler können auch selbstständig für Inline-Ersetzung geeignete Funktionen in der Optimierungsphase identifizieren und ersetzen. In der Programmiersprache Eiffel etwa ist nur diese automatische Inline-Ersetzung vorgesehen.