Frage

VC++ erstellt Funktionen, die innerhalb der Klassendeklaration implementiert werden, als Inline-Funktionen.

Wenn ich eine Klasse deklariere Foo wie folgt, sind dann die CONSTRUCTOR- und DESTRUCTOR-Funktionen Inline-Funktionen?

class Foo 
{
    int* p;
public:
    Foo() { p = new char[0x00100000]; }
    ~Foo() { delete [] p; }
};

{
    Foo f;
    (f);
}
War es hilfreich?

Lösung

Das Definieren des Konstruktorkörpers INNERHALB der Klasse hat den gleichen Effekt wie das Platzieren der Funktion AUSSERHALB der Klasse mit dem Schlüsselwort „inline“.

In beiden Fällen handelt es sich um einen Hinweis für den Compiler.Eine „Inline“-Funktion bedeutet nicht unbedingt, dass die Funktion inline ist.Das hängt von der Komplexität der Funktion und anderen Regeln ab.

Andere Tipps

Die kurze Antwort lautet: Ja.Jede Funktion kann inline deklariert werden, und das Einfügen des Funktionskörpers in die Klassendefinition ist eine Möglichkeit, dies zu erreichen.Sie hätten auch Folgendes tun können:

class Foo 
{
    int* p;
public:
    Foo();
    ~Foo();
};

inline Foo::Foo() 
{ 
    p = new char[0x00100000]; 
}

inline Foo::~Foo()
{ 
    delete [] p; 
}

Es liegt jedoch am Compiler, ob er die Funktion tatsächlich inline ausführt.VC++ ignoriert Ihre Inlining-Anfragen so gut wie.Es wird eine Funktion nur dann einbinden, wenn es dies für eine gute Idee hält.Neuere Versionen des Compilers integrieren auch Dinge, die sich in separaten .obj-Dateien befinden und nicht als Inline deklariert sind (z. B.aus Code in verschiedenen .cpp-Dateien), wenn Sie verwenden Link-Timecode-Generierung.

Du könntest das verwenden __forceinline Schlüsselwort, um dem Compiler mitzuteilen, dass Sie es wirklich ernst meinen, wenn Sie „diese Funktion inline“ sagen, aber das ist es normalerweise nicht wert.In vielen Fällen weiß der Compiler es tatsächlich am besten.

Das Einfügen der Funktionsdefinition in den Klassenkörper entspricht dem Markieren einer Funktion mit dem Inline-Schlüsselwort.Das bedeutet, dass die Funktion vom Compiler inline sein kann oder nicht.Ich schätze, die beste Antwort wäre „vielleicht“?

In dem Maße, in dem wir jede andere Funktion inline machen können, ja.

Ob inline oder nicht, entscheidet größtenteils Ihr Compiler.Inline im Code gibt nur Hinweise an den Compiler.
Eine Regel, auf die Sie sich verlassen können, ist, dass virtuelle Funktionen niemals inline sein werden.Wenn Ihre Basisklasse über einen virtuellen Konstruktor/Destruktor verfügt, wird Ihre Klasse wahrscheinlich nie inline sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top