habe ich mit Funktionsdefinition setzen Inline-Schlüsselwort nicht, weil ich denke, es ist Compiler als Inline-Funktion standardmäßig in dem Körper einer Klasse definiert
Ja, Member-Funktionen betrachten wird. Das Schlüsselwort ist nicht notwendig.
Inline ist nur ein Hinweis auf Compiler, oder? Was, wenn der Compiler es wegen seiner Länge nicht als Inline-Funktion betrachtet?
Ja, irgendwie. Tatsächlich hat das Schlüsselwort inline
zwei Bedeutungen.
Der erste ist der, an den Sie denken, derjenige, der dem Optimierer vorschlägt, den Code im Funktionskörper an der Aufrufstelle einzubinden. Wie Sie bereits sagten, ist dies nur ein Hinweis - der Optimierer kann diese Anfrage ignorieren, wenn er feststellt, dass es sich um eine Leistungspessimierung handelt (oder wenn er aus einem anderen technischen Grund nicht in der Lage ist). Diese Bedeutung des Inline-Schlüsselworts ist wohl obsolet. Alle optimierenden Compiler ignorieren heutzutage das Inline-Schlüsselwort, weil ihre Autoren ihre Heuristiken für klüger halten als den Programmierer. Dies ist fast immer der Fall, so dass es ziemlich sinnlos ist, den Optimierer zu versuchen, indem Sie Ihre Funktionen inline markieren.
Die zweite Bedeutung des Inline-Schlüsselworts besteht darin, die One-Definition-Regel (ODR) zu lockern, so dass mehrere Definitionen der gleichen Funktion für den Linker zulässig sind. (Obwohl das Verhalten des Linkers unter solchen Umständen ein Implementierungsdetail ist, werden die meisten nur willkürlich eine der Definitionen auswählen. Was natürlich nur dann gut funktioniert, wenn sie alle gleich sind.) Diese Bedeutung des Inline-Schlüsselwortes ist immer noch sehr wichtig, und erklärt, warum es heute noch in Code verwendet wird.
Dies ist die Bedeutung, von der Ihr Code profitiert. Da Elementfunktionen, die im Rumpf einer Klasse definiert sind, implizit als Inline gekennzeichnet sind, erhalten Sie keine mehrfach definierten Symbolfehler vom Linker.
Wenn Sie die Funktion in der Header-Datei definiert hatte, aber nicht innerhalb der Klassendefinition in anderen Worten, wenn Sie dies getan hatte:
struct tmp {
void print();
};
void tmp::print()
{ ... }
dann starten Sie das mehrfach definiert Symbol bekommen Fehler, sobald diese Header-Datei in zwei oder mehr Compilanden enthalten war (dh, Übersetzungseinheiten). Hier müssen Sie das Schlüsselwort inline
zur Definition der Funktion hinzufügen, nicht weil Sie möchten, dass der Compiler es "inline" macht, sondern weil Sie sich von der ODR befreien wollen.
Warum? Möchten Sie wirklich, dass der Compiler den gesamten Code jedes Mal kompiliert, wenn die Datei enthalten ist? Was ist der Zweck? – EJP
Der Compiler macht das nicht, @ejp, vorausgesetzt, der Programmierer ist kompetent genug, um Include-Wächter zu verwenden. –
@EJP Nur für Neugier und manchmal kleine Funktion wird größer und größer. –