2009-07-04 4 views

Antwort

5

Nein, es ist nicht implizit inlined. Der Compiler kann nicht wissen, ob ein anderes Modul diese Funktion verwenden wird, also muss er Code dafür generieren.

Das bedeutet zum Beispiel, dass wenn Sie die Funktion wie in einem Header definieren und den Header zweimal enthalten, Sie Linker Fehler über mehrere Definitionen erhalten. Explizit inline behebt das.

Natürlich kann der Compiler die Funktion noch inline einfügen, wenn er denkt, dass dies effizient ist, aber es ist nicht das gleiche wie eine explizite Inlining.

Template-Funktionen sind implizit inline inlined in dem Sinne, dass sie kein inline erfordern, um mehrere Definitionsfehler zu verhindern. Ich denke nicht, dass der Compiler gezwungen ist, diese auch zu inline zu schreiben, aber ich bin mir nicht sicher.

+0

Der Compiler ist nie gezwungen, etwas inline zu schreiben, weil es nur eine Optimierung ist. Es gibt keine Möglichkeit, dass ein Programm den Unterschied erkennen könnte. – curiousguy

1

Es kann inlined sein, abhängig davon, ob der Compiler beschließt, es inline zu machen oder nicht.

6

Es hängt davon ab, was Sie mit inlined meinen. Ein Compiler kann jede Funktion optimieren, indem er seinen ausgegebenen Code an der Aufrufstelle inline einfügt. Aber wenn Sie meinen, verhält sich der Code, den Sie fragen, so, als wäre er deklariert:

inline void func() { ... } 

dann ist die Antwort nein. Wenn Sie Ihren Code in zwei verschiedenen Kompilierungseinheiten platzieren und die ausführbare Datei erstellen, erhalten Sie mehrere Definitionsfehler. Wenn Sie die Funktion explizit als "Inline" markieren, werden Sie dies nicht tun.

In Bezug auf Vorlagenfunktionen wird dann ein Teil des Kompilierungssystems dafür sorgen, dass mehrere Instanzen derselben Vorlage keine Mehrfachdefinitionsfehler verursachen.

+0

Wäre es richtig anzunehmen, dass "inline void func() {...}" in einer .cpp-Datei dasselbe ist wie "static void func() {...}", vorausgesetzt, die entsprechenden Inlining-Optionen sind für den Compiler aktiviert? –

+0

Es scheint möglich (zumindest mit g ++) Inline-Funktionen als extern, aber nicht statisch zu deklarieren. Ich überlasse es einem anderen, ein Standard-Trawl zu machen - hier in London ist es zu heiß. –

+0

Es ist absolut möglich, eine externe Inline-Funktion zu haben. Der Standard erwähnt dies ausdrücklich: "Eine statische lokale Variable in einer externen Inline-Funktion verweist immer auf dasselbe Objekt. Ein String-Literal in einer externen Inline-Funktion ist das gleiche Objekt in verschiedenen Übersetzungseinheiten." – Doug

Verwandte Themen