C++ Konstruktoren vs-Initialisierung-Listen, speed-Vergleich
Gibt es Unterschiede in der Ausführungszeit zwischen Konstruktoren und Initialisierungs-Listen?(oder ist es nur eine Frage der Codierung Präferenz).
Ich habe eine Reihe von Objekten, die erstellt werden muss, die Häufig und würde gerne wissen, ob es irgendwelche performance-Gewinn durch die Verwendung von Initialisierungs-Listen anstelle von Konstruktoren.
Wenn ich erstellen Sie eine Millionen Instanzen der Klasse A und eine weitere million von Klasse B, die Wahl wäre besser(die Objekte repräsentieren-Pakete generiert, in einem Netzwerk, daher diese zahlen).
class A {
private:
int a, b;
public:
A(int a_var, int b_var):a(a_var), b(b_var) {};
};
class B {
private:
int a, b;
public:
B(int a_var, int b_var) {
a = a_var;
b = b_var;
}
};
Wenn einer der Konstruktoren ist schneller als die andere für die primitiven Typen(wie im Beispiel) wird es schneller sein, wenn a und b wurden ersetzt durch Typen?
Typ Beispiel:
class AType {
private:
string a, b;
public:
AType(string a_var, string b_var):a(a_var), b(b_var) {};
};
InformationsquelleAutor der Frage Sebi | 2012-11-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Unterschied ist für Arten mit nicht trivialen Standard-Konstruktor, der aufgerufen wird, für die Sie vom compiler in Ihrer Klasse
B
. Ihre KlasseB
ist äquivalent zu:Wenn Sie nicht member-variable oder Basisklasse Konstruktor in der Initialisierungsliste - I der default-Konstruktor aufgerufen wird.
int
ist basic Art - seine Standard-Konstruktor kostet nichts - also kein Unterschied in deinem Beispiel, aber für komplexere Typen Konstruktor+Belegung Kosten vielleicht mehr als nur bauen.Einige lustige Beispiel, nur zur Verdeutlichung des Unterschiedes:
InformationsquelleAutor der Antwort PiotrNycz
Es ist allgemein akzeptierte Praxis zu verwenden, die Initialisierung der Listen im Gegensatz zur Zuweisung im Konstruktor, und es gibt einen sehr guten Grund dafür.
Initialisierung-Listen können verwendet werden, initialisiert POD (Plain Old Data) und Benutzer-definierte Typen. Bei der Initialisierung ein POD-Typ, der Effekt ist genau das gleiche wie ein Zuweisungsoperator, d.h. es gibt keine performance-Unterschied zwischen der Initialisierung von Listen oder der Abtretung in einen Konstruktor für POD-Typen.
Wenn wir über nicht-POD-Typen werden die Dinge interessanter. Bevor der Konstruktor aufgerufen wird, werden die Konstruktoren der übergeordneten Klasse und dann alle enthaltenen Mitglieder sind aufgerufen, und standardmäßig die no-argument-Konstruktor aufgerufen wird. Mit einer Initialisierungs-Liste können Sie wählen, welcher Konstruktor aufgerufen wird.
Also um die Frage zu beantworten, gibt es einen performance-Unterschied, aber nur bei der Initialisierung nicht-POD-Typen.
InformationsquelleAutor der Antwort blockchaindev
Wenn Mitglieder sind mehr oder weniger komplexe Typen, so gilt die Abtretung der Initialisierung wird zunächst die Ursache der default-Konstruktor aufrufen und dann
operator=
die länger dauern kann.InformationsquelleAutor der Antwort Michael Krelin - hacker
Wird es keine performance-Verbesserung, wenn die Typen sind built-in/Eigenwert.
Sagte:
InformationsquelleAutor der Antwort Science_Fiction
Initialisierung Liste positiver Referenz-Typen, member-Objekte der Klasse oder const Mitglieder. Sonst braucht es mehr Zeit.
Blick auf mein test-code:
Beispiel Ausgaben wie diese:
1.02391
0.934741
InformationsquelleAutor der Antwort Oğuzhan Türk