2016-03-30 12 views
0

(Ich verwende Gnu g ++ v5.2.1 und C++ 11, aber dies ist eine generische C++ Frage.)Sollen meine C++ - Inline-Methoden explizit als Inline deklariert werden?

Ich mag würde ein paar trivialen Methoden in meinen .hpp Dateien setzen. Viele CPP-Dateien in meinem Projekt um diese .hpp Datei:

class foo 
{ 
    public: 

     int  example1(int i) { return i + 5; } 
     inline int example2(int i) { return i + 5; } 
}; 

Gibt es einen Unterschied zwischen example1() und example2(), wenn man explizit inline deklariert ist und der andere nicht inline erwähnen?

Sollte ich einen über den anderen bevorzugen?


Edit: Nein, @HostileFork, dass andere Frage, die Sie markiert haben als ein mögliches Duplikat nicht meine Fragen beantworten.

+2

Mögliches Duplikat [Wann soll ich das Stichwort 'inline' für eine Funktion/Methode schreiben?] (Http://stackoverflow.com/questions/1759300/when-should-i-write -the-keyword-inline-for-a-function-Methode) – HostileFork

+3

Das sind die gleichen. Klassenmemberfunktionen werden automatisch inline, wenn ihre Definition in der Kopfzeile angezeigt wird. Sie müssen nur Nicht-Member-Funktionen "inline" markieren, wenn Sie sie dann in der Header-Datei und nicht in einer Quelldatei (.cpp) definieren möchten, um dem Compiler die Möglichkeit zu geben, Aufrufe zu optimieren. – Galik

+0

@HostileFork die Antworten dort scheinen nur über Nichtmitgliedsfunktionen zu sprechen –

Antwort

0

Ich denke, das hängt von der Option des C++ - Compilers ab. Wenn das Optimierungsniveau hoch ist, werden einige kleine Funktionen als Inline optimiert.

In Ihrem Fall ist die Funktion example2 winzig und einfach, das Inline-Schlüsselwort funktioniert. Zum Beispiel, wenn die Optimierungsstufe hoch ist, kann sie als Inline kompiliert werden, hängt jedoch vom Verhalten des Compilers ab. Wenn die Optimierungsoption deaktiviert ist, handelt es sich nicht um eine Inline-Funktion.

In meinen Augen ist das Schlüsselwort Inline ein Vorschlag an den Compiler, wenn die Funktion komplex ist, kann es keinen Effekt haben.

3

Mitgliederfunktionen mit ihrem Körper innerhalb der Klassendefinition sind implizit inline, so dass Ihre zwei Codebeispiele die gleichen sind.

Es ist jedoch anders, wenn der Körper außerhalb der Leitung vorgesehen ist:

class foo 
{ 
    public: 
     int example1(int i); 
     inline int example2(int i); 
}; 

In diesem Code foo::example2 ist eine Inline-Funktion. Die Out-of-Line-Definition muss auch in der Kopfzeile angezeigt werden (es sei denn, die Funktion ist nie odr- verwendet). Es ist optional, ob die Out-of-Line-Definition auch den Spezifizierer inline enthält.

Für foo::example1, wenn es eine Out-of-Line-Definition mit inline Spezifizierer gibt, dann ist die Funktion inline. Auch wenn eine solche Definition vorhanden ist, muss sie im Header sein, es sei denn, die Funktion ist nie oder.

Diese ODR-Verletzungen sind nicht definiert und erfordern keine Diagnose. In der Praxis bedeutet dies wahrscheinlich, dass es scheinbar "funktioniert" oder einen Verbindungsfehler gibt.


Normalerweise würden Sie nur meinen example2 Fall verwenden, wenn Sie die Funktionsdefinition in der Kopfzeile angezeigt werden sollen, aber sie denken, dass es besser lesbar ist die Klassendefinition kompakt und die Funktion Körper später zu haben.

In diesem Fall würde ich empfehlen, inline sowohl in der Deklaration und Definition zu verwenden, um die Lesbarkeit zu verbessern.

Hinweis für Windows-Programmierung: Wenn die Klasse __declspec(dllexport) oder __declspec(dllimport) markiert ist, dann warnt gcc über example1. Ich bin nicht sicher, was das richtige Verhalten hier ist, aber um mögliche Probleme zu vermeiden, verwenden Sie inline in der Deklaration.

Verwandte Themen