Lifetime eines zurückgegebenen Objektes
-
@Wade1234 sagte in Lifetime eines zurückgegebenen Objektes:
ja aber die programmausgabe, dass da ein kopiervorgang stattfand, muss ja erhalten bleiben. der compiler kann sowas ja nicht einfach entfernen.
Lies irgendeinen der Links, die ich hier gepostet habe, und ändere deine Meinung.
-
@Wade1234 sagte in Lifetime eines zurückgegebenen Objektes:
@manni66 sagte in Lifetime eines zurückgegebenen Objektes:
@Wade1234 sagte in Lifetime eines zurückgegebenen Objektes:
selbst wenn: sobald da cout drin steht, wird gar nichts wegoptimiert.
Die Ausage ist falsch!
ja aber die programmausgabe, dass da ein kopiervorgang stattfand, muss ja erhalten bleiben. der compiler kann sowas ja nicht einfach entfernen.
Die Ausage ist falsch!
-
Doch, s. den schon von @wob geposteten Link zu Copy elision: Return value optimization.
Aber ohne aktivierten Optimierungen (bzw. mit speziellen Compiler-Flags) sollte der Kopierkonstruktor aufgerufen werden.
-
@Th69 sagte in Lifetime eines zurückgegebenen Objektes:
sollte der Kopierkonstruktor aufgerufen werden
Nein, er darf aufgerufen werden. Und stünde dort ein
return Complex ...
ist es ab C++ 17 garantiert, dass er nicht aufgerufen wird.
-
@stud123 sagte in Lifetime eines zurückgegebenen Objektes:
@manni66 wenn ich es nicht darf, wieso funktioniert es denn?
Dass "du es darfst" wurde ja schon beantwortet, womit sich diese Frage auch erübrigt.
Trotzdem der Hinweis: diese Frage solltest du dir bei C++ ganz schnell abgewöhnen. In C++ gibt es haufenweise Dinge die du nicht machen darfst, die aber oft genug zumindest scheinbar funktionieren werden.
Ganz einfaches Beispiel: es funktioniert oft genug auf Member eines Objekts das bereits zerstört und freigegeben wurde zuzugreifen. So lange bis es dann halt irgendwann nicht funktioniert und du einen unerwarteten Wert zurückbekommst oder dir das Programm bei dem Zugriff abstürzt.
Was auch ein ganz schlimmer Fehler ist den viele Anfänger und leider auch einige alte Hasen machen, ist zu versuchen zu verstehen wozu ein bestimmtes Verbot überhaupt da ist, und die Fälle aufzulisten in denen etwas schief gehen könnte. Und dann zu sagen "OK, in meinem Programm kann eh keiner dieser Fälle vorkommen, also ist das OK wenn ich es trotzdem mache". Lass das bleiben. Das führt dich und deine Kollegen über kurz oder lang bloss in eine Welt des Schmerzes.