In C++ kann eine Klassenmitgliedsfunktion deklariert werden:
Innerhalb der Klasse (Inline-Definition):
class A { void foo() { /* ... */ } // direkt innerhalb der Klasse };
Solche Funktionen gelten implizit als inline.
Innerhalb der Klasse (nur Deklaration):
class A { void foo(); // nur Deklaration }; void A::foo() { /* ... */ } // Definition außerhalb der Klasse
Unterschied:
inline, der Compiler kann eine solche Funktion direkt in den Code ihres Aufrufs einfügen.inline ohne explizite Angabe (inline), obwohl das Schlüsselwort hinzugefügt werden kann:
inline void A::foo() { /* ... */ }
Vorteile und Nachteile der Ansätze:
Wird eine Funktion, die innerhalb der Klasse definiert ist, immer tatsächlich vom Compiler eingebaut?
Antwort: Nein. Das Schlüsselwort inline (einschließlich der impliziten Zuweisung bei der Definition innerhalb der Klasse) ist nur eine Empfehlung für den Compiler. Der Compiler kann diesen Hinweis ignorieren, wenn er die Funktion als zu komplex oder ungeeignet für das Einfügen erachtet.
Geschichte 1
In einem großen Projekt wurden Klassenmitglieder als
inlineinnerhalb von Header-Dateien definiert und in tausende von Übersetzungseinheiten eingebunden, was die Kompilierungszeit um ein Vielfaches erhöhte und das Binärfile aufgrund von Code-Duplizierung vergrößerte – der Compiler fasst identische Maschinenimplementierungen nicht immer zusammen.
Geschichte 2
Im Versuch, die Ausführung zu beschleunigen, schob der Entwickler die gesamte Logik der Klasse in die Deklaration (in die .h-Datei). Dies führte dazu, dass bei einer Änderung der Funktion das gesamte Projekt neu kompiliert wurde, und nicht nur die einzelnen Dateien (die tatsächlich von der Integration betroffen waren).
Geschichte 3
Ein neues Teammitglied platzierte lange Methoden zur Serialisierung und Dateioperationen direkt in der Deklaration der Template-Klasse, was zufällige Fehlerübertragungen über alle TU hinaus verursachte und die Größe der ausführbaren Datei ohne Leistungszuwachs vergrößerte.