Vorteile von Initialisierungslisten

Was ich weiß, von Vorteile der Verwendung von Initialisierungs-Liste ist, dass Sie die Effizienz bei der Initialisierung der Klasse Mitglieder, die nicht build-in. Zum Beispiel,

Fred::Fred() : x_(whatever) { }

ist vorzuziehen,

Fred::Fred() { x_ = whatever; }

wenn x ein Objekt einer benutzerdefinierten Klasse. Andere als die, dieser Stil wird verwendet, auch mit built-in-Typen für die Kohärenz.

Die häufigste Vorteil dabei ist die verbesserte performance. Wenn der Ausdruck was auch immer, ist die gleiche Art als member-variable x_, das Ergebnis von dem, was Ausdrucks konstruiert wird, direkt innerhalb von x_ — nicht der compiler machen Sie eine separate Kopie des Objekts.

Mit den anderen Stil, der Ausdruck, was bewirkt, dass ein separates, temporäres Objekt erstellt werden, und dieses temporäre Objekt übergeben wird in der x_-Objekt ist ein Zuweisungsoperator. Dann wird das temporäre Objekt zerstört am ;. Das ist ineffizient.

Frage
Gibt es irgendein Effizienzgewinn im folgenden Beispiel wird mit der Initialisierung der Liste.
Ich denke, es ist kein Gewinn. Die erste version Aufrufe von string copy-Konstruktor und der andere ruft Zeichenfolge Zuweisungsoperator (es gibt keinen temporären thats erstellt). Es das richtig?

class MyClass
{
public:
    MyClass(string n):name(n) { }
private:
    string name;
};

class MyClass
{
public:
    MyClass(string n)
    {
        name=n;
    }
private:
    string name;
};

InformationsquelleAutor der Frage Ankur | 2009-10-21

Schreibe einen Kommentar