Konstruktoren werden nicht aufgerufen
-
#include <iostream> struct Example{ Example(){ std::cout << __PRETTY_FUNCTION__ << '\n'; } Example(const Example& ) { std::cout << __PRETTY_FUNCTION__ << '\n'; } Example(Example&& ) { std::cout << __PRETTY_FUNCTION__ << '\n'; } }; Example foo(){ return Example(); // einmal default ctor } int main(){ /* einmal copy ctor */ foo(); /* zweimal copy ctor */ Example(foo()); return 0; }Kompiliert mit G++ 4.8 und die Bildschirmausgabe lautet
Example::Example() Example::Example()Da fehlen aber noch drei Aufrufe. Warum? Mit
std::endlstatt'\n'hab ich es auch schon versucht - vergeblich.
Bete um Hilfe.Liebe Grüße.
-
Da fehlen aber noch drei Aufrufe
Es kommt da nur "Example::Example()".
Und das hat einen guten Grund:
foo();Kein einziges mal copy-ctor, weil hier nix kopiert wird (wieso auch?). Nur einmal default-ctor, weil es im return-statement so steht.
Example(foo());Das ist eine Funktionsdeklaration. Es deklariert eine Funktion, die keine Argumente nimmt und Example zurückgibt.
-
Ist das etwa Teil des neuen C++11 Standards?
codepad zeigt mir nämlich was anderes.
-
Ups, da hab ich alten Code gepostet, sorry.
#include <iostream> struct Example{ Example(){ std::cout << __PRETTY_FUNCTION__ << '\n'; } Example(const Example& ) { std::cout << __PRETTY_FUNCTION__ << '\n'; } Example(Example&& ) { std::cout << __PRETTY_FUNCTION__ << '\n'; } void foo(){} }; Example foo(){ return Example(); // einmal default ctor } int main(){ /* einmal copy ctor */ foo(); /* zweimal copy ctor */ Example example(foo()); return 0; }
-
Ich würde meinen, Zeile 22 wird auf die einfache Erstellung einer Example Instanz optimiert.
-
Youka schrieb:
Ich würde meinen, Zeile 22 wird auf die einfache Erstellung einer Example Instanz optimiert.
Optimierungen sind allesamt ausgeschaltet.
-
kleinlich schrieb:
codepad zeigt mir nämlich was anderes.
Alle erwarteten Ausgaben werden angezeigt, weil wohl keinerlei Optimierung stattfindet.
kleinlich schrieb:
Optimierungen sind allesamt ausgeschaltet.
Mit Optimierungen bekomme ich aber die gleichen 2 Zeilen raus wie du.
-
Youka schrieb:
kleinlich schrieb:
codepad zeigt mir nämlich was anderes.
Alle erwarteten Ausgaben werden angezeigt, weil wohl keinerlei Optimierung stattfindet.
kleinlich schrieb:
Optimierungen sind allesamt ausgeschaltet.
Mit Optimierungen bekomme ich aber die gleichen 2 Zeilen raus wie du.
Nun, Du denkst Zeile 22 wird optimiert, was ist denn mit Zeile 21?
Selbst dann müsste die AusgabeExample::Example() Example::Example() Example::Example(const Example& )lauten.
-
kleinlich schrieb:
Youka schrieb:
Ich würde meinen, Zeile 22 wird auf die einfache Erstellung einer Example Instanz optimiert.
Optimierungen sind allesamt ausgeschaltet.
Diese Optimierung kannst du nicht so einfach abschalten. Die ist vom Sprachstandard so als das empfohlene Programmverhalten vorgegeben. Beim GCC kann man das mittels -fno-elide-constructors abschalten. Benutz das aber nur dieses eine Mal und sonst nie wieder. Diese Optimierung ist wichtig.
-
SeppJ schrieb:
Diese Optimierung kannst du nicht so einfach abschalten. Die ist vom Sprachstandard so als das empfohlene Programmverhalten vorgegeben. Beim GCC kann man das mittels -fno-elide-constructors abschalten. Benutz das aber nur dieses eine Mal und sonst nie wieder. Diese Optimierung ist wichtig.
Soso!
Danke an alle Antworten.