2013-06-05 7 views
7

Vor einigen Tagen, während Standard C++ news Lesen ich den Beitrag über Defaulted functions in C++11 gelesen haben, wird in diesem Artikel erwähnt, dass die benutzerdefinierten Konstruktor ist weniger effizient als die vom Compiler generiert:Sind benutzerdefinierte Standardkonstruktoren weniger effizient?

Die benutzerdefinierte Der Standardkonstruktor ist weniger effizient als der implizit definierte Standardkonstruktor des Compilers.

das Lesen fortsetzen, gibt es ein Beispiel, wo ein benutzerdefiniertes Konstruktor als Standard markiert ist, und dann sagt:

die explizit vorbelegt Konstruktor ist effizienter als ein manuell programmiert Standardkonstruktors.

Ich verstehe nicht, diese Behauptungen, also ich habe mich gefragt:

  • Warum ein Benutzer-Default-Konstruktor (oder eine spezielle Funktionselement) wäre weniger effizient als der Compiler implizit ein definiert?
  • Wie wird die Effizienz verbessert, indem ein Konstruktor (oder eine spezielle Elementfunktion) explizit defaultiert wird?
  • Welche Richtlinien muss ich befolgen, um einen Konstruktor (oder eine spezielle Elementfunktion) als Standard festzulegen und wie wirkt sich die Effizienz auf diese Entscheidung aus?
+0

http://stackoverflow.com/questions/4275861/why-would-the-implicitly-generated-constructor-et-al-be-more-efficient-than-a-?rq = 1 – shivakumar

+0

Gut ein @shivakumar, aber beide Fragen hat noch keine akzeptierte Antwort, auch die, die Sie erwähnt, dass aus dem Jahr 2010 ist! : O –

Antwort

3

Ich denke, eine bessere Aussage ist, dass eine benutzerdefinierte Standardkonstruktors KANN weniger als ein out erzeugt Compiler effizient sein.

Wenn der Compiler beispielsweise intern einen Standardkonstruktor generiert, kann der Compiler möglicherweise Annahmen und Optimierungen treffen, die er für einen benutzerdefinierten Konstruktor nicht treffen kann (es entstehen Nebenwirkungen).

Denken Sie auch daran, dass ein benutzerdefinierter Standardkonstruktor eine völlig andere Arbeit verrichten könnte, indem er alle seine Mitglieder standardmäßig konstruiert, was dazu führt, dass er weniger effizient (aber auch korrekter) ist. Dies scheint jedoch in dem von Ihnen angegebenen Link nicht der Fall zu sein.

+0

* "Denken Sie auch daran, dass ein benutzerdefinierter Standardkonstruktor völlig andere Arbeit leisten könnte als der Standard - alle seine Mitglieder zu konstruieren" * - Natürlich, aber ich denke, dass dieser Fall sowieso nicht zur Diskussion steht. Aber ein guter Punkt über mögliche größere Optimierungen. –

0

Und wir alle wissen, dass, wenn es im Internet geschrieben ist, es ist, muss es richtig sein ... Warten Sie, oder?

In dem Artikel, wo ich die erste Behauptung von weniger effizient fand, sagt der Autor die Wahrheit. Obwohl Sie es scheinbar falsch interpretieren - in dem Beispiel bezieht es sich auf die handgefertigte ctor verwendet Zuordnung. Aus keinem guten Grund und gegen zwei Jahrzehnte alte Richtlinien.

Nächste Instanz, gleicher Fall. (Als praktische Anmerkung möchte ich hinzufügen, dass für jeden Compiler, der Optimierungen behauptet, ich die gleiche Assy-Ausgabe auch für dieses Formular erwarte ...)

Ich sehe keinen Grund, warum der richtige handschriftliche ctor würde anders sein die ausgefallene in irgendeiner Weise, einschließlich der Effizienz. OTOH, wenn sie identisch sind, warum auf der Erde schreiben Sie es? Ich bin nur zu glücklich, dass der Compiler es für mich macht. Und schließlich kann ich es sogar auf eine Art kontrollieren, die ich vorher nicht konnte. Könnte mehr solcher Funktionen verwenden. ;-)

+0

"* Und wir alle wissen, dass, wenn es im Internet geschrieben ist, es richtig sein muss *" Ich habe angenommen, dass es aufgrund der Schrift stimmen muss;) deshalb erwähne ich die Schrift. –

Verwandte Themen