|
|
Inline (C++)In C++ werden die Anweisungen von Unterprogrammen[1], die mit dem Zusatz inline definiert sind, an jeder Aufrufstelle erneut eingesetzt. Ein Unterprogramm inline zu definieren entspricht dem klassischen Austausch von "Geschwindigkeit der Ausführung" gegen "Platzbedarf des Maschinen-Codes". Da man bei der Programmierung von Mikrocontrollern mitunter in der einen oder anderen Richtung optimieren muss, kann dieses Feature interessant sein. Mit inline wird:
Ohne inline wird:
Als inline definierte Funktionen sind keine Makros. Sie können funktionsähnliche Makros ersetzen, verhalten sich aber "semantisch korrekt" und sind deshalb vorzuziehen. Insbesondere gilt, dass inline-Unterprogramme
Damit sind die folgenden Unterprograme (Vertauschen zweier Ganzzahlen, Bestimmung des Maximums zweier Ganzzahlen) unproblematisch.
Bei "Tricksereien" mit Makros wäre im Fall von swap dagegen die Verwendung
ein Syntaxfehler. (Ein Makro für swap müsste wegen der Hilfsvariablen zu einem ein Block {...} expandieren, womit das Semikolon am Ende der Zeile nicht stehen darf.) Ebenso ist mit einer inline-Funktion
kein Problem. (Ein Makro würde wegen des rein textuellen Ersatzes seiner Parameter die Inkrementierung u.U. doppelt auslösen.) Daß man eine Funktion als inline deklariert, heißt aber nicht zwangsläufig, daß der Compiler den Code bei einem Aufruf wirklich inline einfügen muss. Vielmehr ist das Schlüsselwort inline nur ein Hinweis, daß der Programmierer es für sinnvoll hält. Es steht dem Compiler frei, die Funktion trotzdem wie sonst auch einzeln zu übersetzen und bei jeder Verwendung einen normalen Aufruf einzusetzen. Üblicherweise wird das anhand der Codegröße vom Compiler entschieden, wobei die Grenze meist mit Compileroptionen verschoben werden kann. Die semantische Korrektheit im Vergleich zu funktionsähnlichen Makros ist trotzdem gegeben. Normalerweise wird die Deklaration einer Funktion in einer Headerdatei (Endung .h) vorgenommen, die Definition dagegen in einer .cpp, die möglicherweise getrennt vom restlichen Programm kompiliert wird. Da der Compiler den als inline deklarierten Code überall einsetzen soll, wo die Funktion aufgerufen wird, muß er auch überall den Code kennen. Deshalb schreibt man bei inline-Funktionen die gesamte Definition gleich in die Headerdatei. Das dabei sonst auftretende Linkerproblem (Funktion mehrfach definiert) entfällt. Dies gilt auch, wenn der Compiler das Schlüsselwort inline ignoriert (in diesem Fall bekommt der Linker eventuell die kompilierte Funktion mehrfach präsentiert und nimmt dann stillschweigend nur eine davon, in der Hoffung daß sie alle gleichwertig sind). Dies kann man "mißbrauchen", um eine kleine Bibliothek von Hilfsfunktionen einfach als Headerdatei zu schreiben, ohne getrennt zu kompilierenden Quelltext verwenden zu müssen. Bei der Definition von Klassen sind alle Methoden, die innerhalb der Klasse definiert werden (nicht nur deklariert), automatisch inline. Man kann sich das Schlüsselwort also dort sparen. [Bearbeiten] Fußnoten
|