2009-03-17 6 views

Antwort

5

Der Standard besagt, dass alle Compiler Inline-Anfragen ignorieren kann, ob implizit oder explizit. Ob sie dies tun oder nicht, hängt natürlich davon ab, ob die Funktion praktisch inline sein kann - beispielsweise können rekursive Funktionen nicht sein.

Edit: Nur um zu klären - die Fragesteller dies ignorieren, aus dem vorherigen Absatz in der Norm, dass er aus zitiert:

Eine Implementierung nicht zu führen diese Inline-Substitution an erforderlich ist die Anlaufstelle

+0

Neben den hinterhältigen Destruktoraufrufen können rekursive Tailfunktionen in eine Schleife "eingebunden" werden, obwohl dies die Definition von Inlining erweitert.:) –

+0

danke für die Antwort, aber das beantwortet meine Frage nicht –

+0

dann machen Sie Ihre Frage klarer –

8

Sie scheinen zu missverstehen, was "inline" bedeutet. Es bedeutet nicht, dass Funktionen automatisch inline werden; nach 7.1.2-2 bedeutet dies, dass eine Inline-Substitution vorzuziehen ist.

Daher können Sie nicht sagen, ob eine Funktion inline oder nicht aus dem Code bezeichnet wird, da der Compiler frei ist, auf die eine oder andere Weise zu entscheiden. Es ist nur ein Compiler-Hinweis.

+0

Ich glaube, dass jeder Compiler, der diesem Standard folgt, inline EMPTY-Funktion wäre. Nehmen wir an, diese leere Funktion wird millionenfach in einer Schleife aufgerufen - ich glaube, der Compiler SOLLTE es inline, weil Effizienz wäre 1000000 * call_time/0 * inline_nothing. –

+0

Sie können glauben, was Sie wollen - es macht es nicht wahr –

+1

Aktuelle Inlining ist eine Qualität der Umsetzung Problem. Der Compiler ist vollkommen frei inline oder nicht. Wenn Sie es nicht mögen, sehen Sie, ob die Optionen Dinge ändern oder einen anderen Compiler bekommen. –

0

Compiler ist normalerweise inline basierend auf der Anzahl der Aufrufe an die Funktion, die Anzahl der Pseudobefehle in der Funktion und eine Reihe anderer Dinge. Werfen Sie einen Blick auf die GCC documentation on optimization options für eine Idee, wie es Dinge macht. Grundsätzlich ist das Schlüsselwort inline nur ein Hinweis, der die Wahrscheinlichkeit erhöht, dass der Compiler inline wird. Die eigentliche Entscheidung für Inline ist in der Regel komplex.

4

Ich vermute, dass Ihr Test fehlerhaft ist. Sie können nicht mit nur einer solchen Datei testen, ob der Compiler den Inline-Spezifizierer ignoriert oder nicht.

Sie müssen den Header mit der Inline-Funktionsdefinition einschließen und ihn in mehrere Implementierungsdateien einbeziehen, die dann miteinander verknüpft werden. Wenn Sie Linkerfehler über mehrere definierte Instanzen dieser Funktionen erhalten, dann ist der Compiler Ignorieren der Inline-Spezifizierer in Bezug auf seine wichtigste Eigenschaft: Zulassen, dass es mehrmals über das gesamte Programm definiert wird, während immer noch die gleiche Adresse für es und seine lokale statische Variablen.

Was Ihr Test wahrscheinlich prüft, ist, ob der Compiler den Aufruf der Funktion inliniert, was eigentlich nur ein Hinweis auf den Compiler ist und nur eine kleine von vielen anderen wichtigeren Konsequenzen des Inline-Spezifizierers. Wenn der Compiler keinen Aufruf an die Funktion inline aufruft, ist es in Ordnung. Der Standard verlangt nicht, dass er in dieser Angelegenheit etwas unternimmt.

2

Siehe meine Antwort auf eine ganz ähnliche Frage: When is "inline" ineffective? (in C)

Zusammenfassung: inline ist nur mehrere Definitionen ermöglichen erforderlich. Jede Funktion, die Änderungen aufruft, ist rein optional.

+1

beachten Sie, dass diese andere Antwort über C. in C++ ist es anders: Es erfordert nicht "genau eine externe Definition" einer Funktion, wenn Sie eine Inline-Funktion verwenden: Die Inline-Funktion selbst ist diese Definition in C++. in C ist es nicht, aber es ist nur eine "Inline-Definition". –

+0

Ich weiß, aber ich lese die relevanten Begriffe für C++ tatsächlich neu. Es gibt kaum einen praktischen Unterschied für diese Frage: Es geht darum, nicht zu verstehen, was Inline wirklich bedeutet. – Richard

Verwandte Themen