Verschieben von inline-Methoden aus einer header-Datei ein .cpp Dateien
Habe ich die folgende Klasse definiert ein foo.h
header-Datei
class Foo {
public:
inline int Method();
};
inline int Foo::Method() { //Implementation }
Möchte ich mich jetzt bewegen Sie die Umsetzung zu einem foo.cpp
- Datei. Zu diesem Zweck habe ich zum entfernen der inline
Schlüsselwort bewegen und die Implementierung der Methode, um ein foo.cpp
- Datei wie folgt
#include `foo.h`
inline int Foo::Method() { //Implementation }
Habe ich zwei Fragen:
- Ist meine Aussage über die Entfernung der
inline
keyword-richtig? Sollte es unbedingt entfernt? - Wie in der Regel die Entfernung der
inline
keyword Auswirkungen auf die Leistung (praktisch alle meine Methoden sind inline)?
Vielen Dank im Voraus.
- inline gibt an, dass die Funktion inlined, die endgültige Entscheidung macht der compiler entscheidet, ob Sie Ihre Funktion sein wird oder nicht inlined.
- Es ist durchaus möglich, es wird inline in einigen Orten und an anderen nicht, oder gar nicht, oder überall, oder ändern Sie es zur Laufzeit, etc.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie verschoben die definition der Funktion aus einem header, um eine cpp Datei, die Sie entfernen MÜSSEN, die
inline
Schlüsselwort all alle Standorte für diese Funktion. Mit älteren linkers könnte es machen, die Dinge ein wenig langsamer, aber mit modernen linkers Sie sollte merke keinen wirklichen Unterschied in der Leistung.*Gibt es bestimmte Fälle, in denen eine öffentliche member-Funktion kann
inline
, aber das ist nur eine schlechte Idee. Tun Sie es nicht. Argumente können gemacht werden für die Kennzeichnung von bestimmten private member-Funktionen alsinline
, aber in Wirklichkeit, was Sie wirklich wollen, in denen__attribute__((always_inline))
oder__forceinline
*In extrem seltenen Fällen kann es einen Unterschied machen wird, aber 99% der Zeit nicht, und 99,9% von dem, was übrig bleibt, kümmert man sich nicht. Wenn Messungen zeigen, Sie schlagen, dass ein-in-zehn-tausend, die Sie verwenden können, die oben genannten
__forceinline
.__forceinline
d a private member-Funktion vor, obwohl als Ergebnis des profiling.inline
sind verschiedene Tiere, aber ich werde es erwähnenStichwort
inline
ist redundant in der Klasse. Es wird impliziert, wenn Sie eine Funktion haben Körper.In der Umsetzung-Datei ist es auch ziemlich redundant.
Nur einsetzen, wenn Sie definieren, eine freie Funktion im header (oder eine member-Funktion außerhalb der Klasse, aber in der Kopfzeile) zu vermeiden, mehrere Körper.
Optimierung-Weise auf Nebel modernen Compilern ist es noch überflüssiger, Sie inline-alles im Blick, ohne Frage, ohnehin, oder Sie ignorieren das Schlüsselwort in wird.
Der inline-Nutzung muss einheitlich sein! Von 7.1.2p4:
Wenn die Funktion nicht den KLEINEN (oder nimmt mehrere Argumente, aber nicht viel, wie ein Konstruktor oder ähnliches, das braucht ein paar Dinge, und kopiert es irgendwo in der Klasse), inlining wird es wenig Auswirkungen haben auf die Leistung in den ersten Platz. Setter und Getter sind in der Regel gute Kandidaten für inline -, da Sie (in der Regel) nur das kopieren von Daten von einem Ort zu einem anderen, und kann leicht getan werden, wo der Anruf erfolgt.
Wie schon andere gesagt haben, es ist ein "bitte-compiler, wenn ich darf bitten Sie, berücksichtigen, inlining dieser Funktion" - es ist nicht ein "machen diese inline-Funktion". Der compiler, auf der anderen Seite, wird Häufig von inline-Funktionen, UNABHÄNGIG davon, ob es sich um ein
inline
Schlüsselwort. Es sieht an der Größe der Funktion, die Anzahl der Anrufe und wie viel größer der code wird von inlining.Wenn Sie verschieben die Funktion "foo.cpp" es wird NUR inline in der "foo.cpp" compile-Einheit (in der Regel compile unit = Quelldatei).
Ist, es sei denn, Sie haben eine compiler-fähig, "whole program optimization" oder ähnliche tricks, und diese Funktion aktivieren - dies bedeutet im Grunde, dass anstelle der Erzeugung einer ready-to-link-object-Datei mit Maschinencode, den der compiler erzeugt einen "analysiert, aber nicht komplett übersetzt-zu-Maschine-Anweisungen" Objekt-Datei. Dann, wenn es darum geht, endlich setzen Sie die ausführbare Datei (oder shared library) toegether, der compiler/linker wird produzieren Sie ein großer Klumpen Maschinen-code von der "auf halbem Weg" - code. Beide MS und GCC unterstützen, aber ich weiß nicht, wie gut es funktioniert für große Projekte.
Edit:
Als pro Muhen Duck ' s Kommentar: Ein
inline
Funktion nicht, stellen Sie eine echte Funktion Namen in der Objekt-Datei, so dass der linker kann auch Fehler fürunresolved symbol int Foo::Method()
[oder irgendeine Formulierung, um das Ausmaß].Ende Bearbeiten.
Wenn die Leistung entscheidend ist, sollten Sie Messen den aktuellen code von der Leistung, dann machen Sie Ihre änderungen, und Messen Sie erneut. Wenn es deutlich unterschiedlich, Sie haben Ihre Antwort. Wenn es schneller (weil weniger inlining führt zu mehr cache-hit-rate für die anderen bits des Codes, zum Beispiel), dann ist das gut. Wenn es langsamer wird, müssen Sie Sie wieder (einige) die Funktionen in der header-Datei. Oder Leben wird langsamer... Oder einen anderen Weg finden, dass es wieder schneller... du hast Die Wahl (und, wenn Sie in einer Gruppe arbeiten, einige andere Leute haben ein Mitspracherecht bei der endgültigen Entscheidung, natürlich). Es ist fast unmöglich für alle, SICHER zu sagen, welchen Weg es gehen wird, ohne das zumindest das Verständnis der ganzen Programme Architektur und, was geht auf in der Klasse - was angesichts der Namen "foo.cpp" in der post ist wohl nicht der EIGENTLICHE code...
inline
Funktion definition einer cpp-Datei?Du, und die Leute die hier Ratschläge geben, über kleine Funktionen, suchen bei
inline
die altmodische Art und Weise.inline
im Sinne von "ich möchte diesen code zu schnell laufen, also immer wenn ich diese Funktion aufrufen zu können, möchte ich Sie ausbauen -, die verhindern, dass der overhead eines Funktionsaufrufs."Das ist wirklich eine sehr gute Optimierung. Es ist so gut, in der Tat, dass der compiler wird eifrig tun, auch wenn Sie nicht angeben
inline
.Außerdem ist der compiler frei nicht erweitern Sie Ihre
inline
Funktionen. So haben Sie nicht wirklich Gedanken machen, wie es wirkt sich auf die Leistung, weil der compiler das kann und wird ignoriereninline
wenn Sie es in eine dumme Art und Weise.In der Tat, Compiler heute fast immer ignorieren Ihre Nutzung der
inline
, und nur tun, was Sie denken, ist am besten.So, zu wissen, dass, warum die Menschen immer noch verwenden
inline
?Es gibt nur einen Grund für die Verwendung
inline
heute, und das ist die Arbeit rund um die One Definition Rule (ODR).In C/C++, man darf nur eine Funktion definieren, einmal. Wenn Sie dies tun:
wird der compiler sich beschweren, dass Sie definiert haben, die gleiche Funktion zweimal.
Das aussieht wie ein dummes Beispiel, aber es ist besonders einfach, etwas zu tun, wenn Sie mit
#include
- wenn Sie definiert Ihre Funktion in einer header -, und Sie#include
den gleichen Kopf zweimal, das ist genau das, was du tust.Glücklicherweise
inline
hat eine andere Verwendung, die heute noch gültig ist: wenn Sie eine Funktion alsinline
es zwingt den compiler zu schweigen ODR Fragen, macht es möglich, definieren Sie Ihre Funktion in einer header.In anderen Worten,
inline
nun bedeutet "ich will, um zu definieren, diese Funktion in einer header".Wenn Sie es auf diese Weise betrachten, es sollte klar sein, dass sollten Sie entfernen das
inline
beim verschieben die Funktion in eine cpp-Datei.Für Interesse halber, es gibt ein paar Orte, wo die Funktionen sind implizit inline. Einer von Ihnen ist in der Klasse member-Funktionen:
Habe ich Menschen gesehen, markieren Funktionen, wie das
inline
, aber das ist völlig überflüssig. Der compiler es trotzdem macht; es gibt keine Notwendigkeit zu kümmern, ODR, und es gibt keine performance-gewonnen werden.Der andere Ort ist in den Vorlagen. Da Vorlagen haben definiert werden, der im Header, Sie sind befreit von der ODR und
inline
ing, Sie ist redundant.Kann es verwirrend sein, aber man sollte nicht denken, dass der Zweck der
inline
zu machen, die der compiler inline-Funktion. (Moderne Compiler sind übrigens klüger als du, in Bezug auf, wenn eine Funktion inlined oder nicht, sowieso).Nein, der eigentliche Zweck der
inline
ist zu sagen, der linker keine sorgen mehr zu machen über mehrere Definitionen der Funktion. Wenn du die definition einer (nicht-Mitglied) - Funktion in eine Kopfzeile, markieren Sie esinline
zu vermeiden linker Fehler.2. How typically the removal of the inline keyword affect the performance (practically all my methods are inlined)?
Den
inline
- Schlüsselwort weist den compiler an, nehmen Sie den code zur Implementierung der Funktion und setzen es an die Stelle der Aufruf der Funktion. Dies reduziert die Anzahl von Funktionsaufrufen auf dem Stapel und wenn richtig eingesetzt, kann zur Verbesserung der Leistung des Programms.Den
inline
keyword sollte nur verwendet werden, mit kleinen Funktionen. Get-und Set-Funktionen sind gute Beispiele. Sie legen den Wert einer Variablen oder den Rückgabewert einer variable.Wenn Sie eine Funktion mit einer Menge von code
inline
, es kann Zunahme die Größe der Ihren code, indem Sie eine Menge (je nach Größe der Funktion, code und wie oft diese Funktion genutzt wird) und tatsächlich VERRINGERN die Leistung des Programms.inline
] - Schlüsselwort entfernt werden?"