<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[return by value - deep&#x2F;shallow copy]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>eine Frage, wenn ich ein Objekt einer selbst erstellten Klasse wie gewohnt per value zurückgebe wie z.B. hier</p>
<pre><code class="language-cpp">class A {...}

A foo()
{
  A a;

  return a;
}
</code></pre>
<p>wird dann die zurückgegebene Kopie von a dann mit Hilfe des Kopierkonstruktors meiner Klasse A erstellt, d.h. falls keiner angegeben ist per default Kopierkonstruktor, was einer shallow-copy entspricht und falls ein eigener Kopierkonstruktor definiert wird, halt mit dessen Hilfe (wie auch immer das im Einzelfall dann auch aussieht) ?</p>
<p>Gruß <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/302195/return-by-value-deep-shallow-copy</link><generator>RSS for Node</generator><lastBuildDate>Tue, 11 Aug 2026 10:12:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/302195.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 13 Apr 2012 08:42:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to return by value - deep&#x2F;shallow copy on Fri, 13 Apr 2012 08:42:46 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>eine Frage, wenn ich ein Objekt einer selbst erstellten Klasse wie gewohnt per value zurückgebe wie z.B. hier</p>
<pre><code class="language-cpp">class A {...}

A foo()
{
  A a;

  return a;
}
</code></pre>
<p>wird dann die zurückgegebene Kopie von a dann mit Hilfe des Kopierkonstruktors meiner Klasse A erstellt, d.h. falls keiner angegeben ist per default Kopierkonstruktor, was einer shallow-copy entspricht und falls ein eigener Kopierkonstruktor definiert wird, halt mit dessen Hilfe (wie auch immer das im Einzelfall dann auch aussieht) ?</p>
<p>Gruß <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201476</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201476</guid><dc:creator><![CDATA[MatheStein]]></dc:creator><pubDate>Fri, 13 Apr 2012 08:42:46 GMT</pubDate></item><item><title><![CDATA[Reply to return by value - deep&#x2F;shallow copy on Fri, 13 Apr 2012 08:46:18 GMT]]></title><description><![CDATA[<p>Ja, das ist richtig so.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201477</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201477</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Fri, 13 Apr 2012 08:46:18 GMT</pubDate></item><item><title><![CDATA[Reply to return by value - deep&#x2F;shallow copy on Fri, 13 Apr 2012 08:50:41 GMT]]></title><description><![CDATA[<p>Danke für deine Hilfe <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
<p>Hätte ich dann in der Klasse A irgendwelche Speicherallokationen, dann würde (falls gut programmiert wurde) nach Beenden von &quot;foo()&quot; alles an allokiertem Speicher in dem Objekt &quot;a&quot; freigegeben werden und in der zurückgegebenen Kopie von a nicht mehr zur Verfügung stehen oder?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201479</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201479</guid><dc:creator><![CDATA[MatheStein]]></dc:creator><pubDate>Fri, 13 Apr 2012 08:50:41 GMT</pubDate></item><item><title><![CDATA[Reply to return by value - deep&#x2F;shallow copy on Fri, 13 Apr 2012 09:02:20 GMT]]></title><description><![CDATA[<p>Ich bin mir nicht ganz sicher ob ich dich richtig verstanden habe, aber ich glaube was du sagst ist korrekt.</p>
<p>Als Beispiel folgender Code:</p>
<pre><code class="language-cpp">class Foo
{
public:
	int* i;
	Foo()
		: i( new int(10) )
	{}

	~Foo()
	{
		delete i;
	}
};

Foo foo()
{
	Foo f;
	return f;
}

int main() 
{ 
	Foo cpy = foo();
	cout &lt;&lt; *cpy.i &lt;&lt; endl; // Undefined behavior
}
</code></pre>
<p>Hier hast du das Problem, dass beim Verlassen der Funktion foo() das f kopiert wird und dann zerstoert. Dabei wird der Destruktor von f aufgerufen und delete auf i aufgerufen. Die Kopie ist eine Shallow-Copy, das heisst die Kopie, die zurueckgegeben wird, zeigt nun auf geloeschten Speicher. Das Dereferenzieren in Zeile 24 erzeugt dann undefiniertes Verhalten.</p>
<p>*Edit<br />
Die Loesung waere dann natuerlich einen Copy-Constructor einzufuehren, der eine Deep Copy erstellt:</p>
<pre><code class="language-cpp">Foo( const Foo&amp; f )
		: i( new int(*f.i) )
	{}
</code></pre>
<p>Oder besser: Gleich RAII verwenden oder gar nicht erst new brauchen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201484</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201484</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Fri, 13 Apr 2012 09:02:20 GMT</pubDate></item><item><title><![CDATA[Reply to return by value - deep&#x2F;shallow copy on Fri, 13 Apr 2012 09:03:45 GMT]]></title><description><![CDATA[<p>Ja vielen Dank, genau das meinte ich <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Könnte man das Problem mit Smart-Pointern lösen?<br />
Wenn ich das richtig verstanden habe löschen diese sich selbst, sobald keine Referenz mehr auf den entsprechenden Speicher existiert, was in unserem Fall bedeuten würde, dass nach verlassen von foo() der Speicher auf die 10 ints nicht freigegeben wird, da der Rückgabewert von foo() noch eine Referenz auf diesen beinhaltet.</p>
<p>Gruß <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201489</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201489</guid><dc:creator><![CDATA[MatheStein]]></dc:creator><pubDate>Fri, 13 Apr 2012 09:03:45 GMT</pubDate></item><item><title><![CDATA[Reply to return by value - deep&#x2F;shallow copy on Fri, 13 Apr 2012 09:12:32 GMT]]></title><description><![CDATA[<p>Ja man kann dies mit Smart Pointern loesen. Smart Pointer sind eine Moeglichkeit RAII umzusetzen.</p>
<p>Es gibt allerdings ganz verschiedene Smart Pointer. Es funktionieren nicht alle ueber Reference Count. Ich denke fuer diesen Fall waere ein shared_ptr angebracht.</p>
<p><a href="http://www.highscore.de/cpp/boost/" rel="nofollow">Hier</a> werden ein paar Smart Pointer aus der boost library erklaert. shared_ptr ist im namespace tr1 und wird von den modernen Compilern unterstuezt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201496</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201496</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Fri, 13 Apr 2012 09:12:32 GMT</pubDate></item><item><title><![CDATA[Reply to return by value - deep&#x2F;shallow copy on Fri, 13 Apr 2012 09:16:37 GMT]]></title><description><![CDATA[<p>Vielen Dank für deine Hilfen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201499</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201499</guid><dc:creator><![CDATA[MatheStein]]></dc:creator><pubDate>Fri, 13 Apr 2012 09:16:37 GMT</pubDate></item><item><title><![CDATA[Reply to return by value - deep&#x2F;shallow copy on Fri, 13 Apr 2012 09:17:13 GMT]]></title><description><![CDATA[<p>Smartpointer bzw. RAII und das Problem der Tiefen/Flachen-Kopien sind orthogonal zueinander.<br />
Auch wenn Du einen shared_ptr benutzt, hast Du nach wie vor nur flache Kopien.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201500</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201500</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 13 Apr 2012 09:17:13 GMT</pubDate></item><item><title><![CDATA[Reply to return by value - deep&#x2F;shallow copy on Fri, 13 Apr 2012 09:19:45 GMT]]></title><description><![CDATA[<p>Danke <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Ich meinte bzgl. der smart Pointer jetzt nur Erstellen/Zerstören der Speicherbereiche und nicht die Modifikation, habe ich vergessen beizuschreiben</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201501</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201501</guid><dc:creator><![CDATA[MatheStein]]></dc:creator><pubDate>Fri, 13 Apr 2012 09:19:45 GMT</pubDate></item><item><title><![CDATA[Reply to return by value - deep&#x2F;shallow copy on Fri, 13 Apr 2012 11:37:50 GMT]]></title><description><![CDATA[<p>Ne, nix. Mit C++11 Move-Konstruktoren ist das Problem doch längst gelöst, wundert mich, dass das noch niemand erwähnt hat. oO</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201578</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201578</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Fri, 13 Apr 2012 11:37:50 GMT</pubDate></item><item><title><![CDATA[Reply to return by value - deep&#x2F;shallow copy on Fri, 13 Apr 2012 13:53:44 GMT]]></title><description><![CDATA[<p>Danke für deine Antwort <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
<p>Kann man es denn irgendwie bewerkstelligen, dass bei der return-Anweisung gemoved wird anstatt kopiert, d.h. dass der move-Konstruktor verwendet wird anstatt der copy-Konstruktor?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201641</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201641</guid><dc:creator><![CDATA[MatheStein]]></dc:creator><pubDate>Fri, 13 Apr 2012 13:53:44 GMT</pubDate></item><item><title><![CDATA[Reply to return by value - deep&#x2F;shallow copy on Fri, 13 Apr 2012 13:54:17 GMT]]></title><description><![CDATA[<p>Das passiert automatisch, sofern ein Move-Konstruktor vorhanden ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201642</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201642</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Fri, 13 Apr 2012 13:54:17 GMT</pubDate></item><item><title><![CDATA[Reply to return by value - deep&#x2F;shallow copy on Fri, 13 Apr 2012 13:57:18 GMT]]></title><description><![CDATA[<p>Kann man dann zusammenfassend festhalten, dass wenn man eine lokale Variable returned automatisch der move-Konstruktor gewählt wird, sofern er vorhanden ist (ansonsten der copy-Konstruktor) und wenn eine globale Variable returned wird stets der copy-Konstruktor?</p>
<p>Gruß <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201644</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201644</guid><dc:creator><![CDATA[MatheStein]]></dc:creator><pubDate>Fri, 13 Apr 2012 13:57:18 GMT</pubDate></item><item><title><![CDATA[Reply to return by value - deep&#x2F;shallow copy on Fri, 13 Apr 2012 14:10:14 GMT]]></title><description><![CDATA[<p>Ne, es gibt auch noch statische Variablen etc.<br />
Es wird immer kopiert, es sei denn durch das return statement wird die Lebenszeit zurückgegebenen Objekts beendet, dann wird gemoved. Irgendwie logisch. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201649</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201649</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Fri, 13 Apr 2012 14:10:14 GMT</pubDate></item><item><title><![CDATA[Reply to return by value - deep&#x2F;shallow copy on Fri, 13 Apr 2012 14:11:20 GMT]]></title><description><![CDATA[<p>Ja stimmt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Vielen Dank <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201651</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201651</guid><dc:creator><![CDATA[MatheStein]]></dc:creator><pubDate>Fri, 13 Apr 2012 14:11:20 GMT</pubDate></item><item><title><![CDATA[Reply to return by value - deep&#x2F;shallow copy on Fri, 13 Apr 2012 14:12:28 GMT]]></title><description><![CDATA[<p>Nein das stimmt so nicht. Die Ausgabe dieses Programms</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class A
{
public:
    A()
    {
        std::cout &lt;&lt; &quot;default&quot; &lt;&lt; std::endl;
    }
    A( const A&amp; )
    {
        std::cout &lt;&lt; &quot;copy&quot; &lt;&lt; std::endl;
    }
    A( A&amp;&amp; )
    {
        std::cout &lt;&lt; &quot;move&quot; &lt;&lt; std::endl;
    }
    ~A()
    {
        std::cout &lt;&lt; &quot;destruction&quot; &lt;&lt; std::endl;
    }
};

A foo()
{
    A a;
    return a;
}

int main()
{
    A a = foo();
}
</code></pre>
<p>Ist bei mir beispielsweise nur</p>
<pre><code>default
destruction
</code></pre>
<p>Der compiler konstruiert das A aus foo direkt dorthin, wo es nach der Funktion gebraucht wird, d.h. es wird nie kopiert. Stattdessen übergibt main() foo() implizit einen return_ptr (oder wie man das auch nennen will), wohin das Objekt konstruiert werden soll, d.h. auf den Stackbereich von main(). Dadurch kann foo() einfach returnen und braucht a gar nicht zu kopieren oder zu moven.<br />
Hier ist sowas nicht möglich, da je nach Pfad ein anderes Objekt returned werden kann (zumindest moved mein gcc hier):</p>
<pre><code class="language-cpp">A foo()
{
    A a;
    A b;
    if( true )
        return a;
    else
        return b;
}
</code></pre>
<p>Ich meine diese Optimierung heißt 'return value optimization', danach kannst du mal googlen. Es gibt auch einige gute Tutorials zum Thema move, z.B. 'moving forward'.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201652</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201652</guid><dc:creator><![CDATA[GorbGorb]]></dc:creator><pubDate>Fri, 13 Apr 2012 14:12:28 GMT</pubDate></item><item><title><![CDATA[Reply to return by value - deep&#x2F;shallow copy on Fri, 13 Apr 2012 14:15:05 GMT]]></title><description><![CDATA[<p>Danke für deine Hilfe, bekommt man diese Ausgabe auch, wenn man alle Optimierungen deaktiviert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201656</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201656</guid><dc:creator><![CDATA[MatheStein]]></dc:creator><pubDate>Fri, 13 Apr 2012 14:15:05 GMT</pubDate></item><item><title><![CDATA[Reply to return by value - deep&#x2F;shallow copy on Fri, 13 Apr 2012 14:17:37 GMT]]></title><description><![CDATA[<p>Nein, RVO wird üblicherweise nur im Releasemodus durchgeführt. Du bekommst also im Debugmodus eine andere Ausgabe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201657</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201657</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Fri, 13 Apr 2012 14:17:37 GMT</pubDate></item><item><title><![CDATA[Reply to return by value - deep&#x2F;shallow copy on Fri, 13 Apr 2012 14:18:20 GMT]]></title><description><![CDATA[<p>Bei mir schon, ja. Ich weiß aber nicht, ob diese Optimierung verpflichtend im Standard festgelegt ist, oder ob man auch standardkonform immer kopieren/moven darf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201658</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201658</guid><dc:creator><![CDATA[GorbGorb]]></dc:creator><pubDate>Fri, 13 Apr 2012 14:18:20 GMT</pubDate></item><item><title><![CDATA[Reply to return by value - deep&#x2F;shallow copy on Fri, 13 Apr 2012 14:22:20 GMT]]></title><description><![CDATA[<p>Sie wird wohl nicht verpflichtend sein, wenn im Debugmodus die &quot;normale&quot; Ausgabe kommt. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201661</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201661</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Fri, 13 Apr 2012 14:22:20 GMT</pubDate></item><item><title><![CDATA[Reply to return by value - deep&#x2F;shallow copy on Fri, 13 Apr 2012 14:25:10 GMT]]></title><description><![CDATA[<p>Der Debug-Modus wird beim GCC mit -g eingeleitet oder? Bei mir ändert sich da nichts an der Ausgabe <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201666</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201666</guid><dc:creator><![CDATA[MatheStein]]></dc:creator><pubDate>Fri, 13 Apr 2012 14:25:10 GMT</pubDate></item><item><title><![CDATA[Reply to return by value - deep&#x2F;shallow copy on Fri, 13 Apr 2012 14:30:54 GMT]]></title><description><![CDATA[<p>Kann sein, dass GCC das immer an hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201667</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201667</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Fri, 13 Apr 2012 14:30:54 GMT</pubDate></item><item><title><![CDATA[Reply to return by value - deep&#x2F;shallow copy on Fri, 13 Apr 2012 14:41:23 GMT]]></title><description><![CDATA[<p>Ich bekomme aber die Ausgabe (mit oder ohne -g), die eigentlich im Release-Modus erscheinen sollte:</p>
<p>default<br />
destruction</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201671</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201671</guid><dc:creator><![CDATA[MatheStein]]></dc:creator><pubDate>Fri, 13 Apr 2012 14:41:23 GMT</pubDate></item><item><title><![CDATA[Reply to return by value - deep&#x2F;shallow copy on Fri, 13 Apr 2012 14:43:18 GMT]]></title><description><![CDATA[<p>Sag ich doch. GCC macht RVO scheinbar einfach immer, warum auch nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201672</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201672</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Fri, 13 Apr 2012 14:43:18 GMT</pubDate></item><item><title><![CDATA[Reply to return by value - deep&#x2F;shallow copy on Fri, 13 Apr 2012 14:50:42 GMT]]></title><description><![CDATA[<p>Daran soll's nicht scheitern.</p>
<pre><code class="language-cpp">#include &lt;cstdlib&gt;
#include &lt;iostream&gt;

struct A {
  A()           { std::cout &lt;&lt; &quot;default&quot;     &lt;&lt; std::endl; }
  A(A const &amp;)  { std::cout &lt;&lt; &quot;copy&quot;        &lt;&lt; std::endl; }
  A(A &amp;&amp;)       { std::cout &lt;&lt; &quot;move&quot;        &lt;&lt; std::endl; }
  ~A()          { std::cout &lt;&lt; &quot;destruction&quot; &lt;&lt; std::endl; }
};

A foo()
{
  A a, b;

  // RVO verhindern.
  return std::rand() % 2 == 0 ? a : b;
}

int main()
{
  A a = foo();
}
</code></pre>
<p>gibt bei mir</p>
<pre><code>default
default
copy
destruction
destruction
destruction
</code></pre>
<p>Move gibt's mit</p>
<pre><code class="language-cpp">return std::move(std::rand() % 2 == 0 ? a : b);
</code></pre>
<p>a in main wird allerdings von gcc nach wie vor direkt initialisiert. Grundlage ist g++ 4.7.0 mit -std=c++11.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201679</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201679</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Fri, 13 Apr 2012 14:50:42 GMT</pubDate></item><item><title><![CDATA[Reply to return by value - deep&#x2F;shallow copy on Fri, 13 Apr 2012 14:54:24 GMT]]></title><description><![CDATA[<p>MatheStein schrieb:</p>
<blockquote>
<p>Der Debug-Modus wird beim GCC mit -g eingeleitet oder? Bei mir ändert sich da nichts an der Ausgabe <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
</blockquote>
<p>-g erzeugt nur Debug-Symbole.<br />
-O0 setzt die Optimierungen auf 0, also Debug-Build. -O1, -O2, -O2.5, -Os und -O3 erzeugen Realese-Builds.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2201680</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2201680</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Fri, 13 Apr 2012 14:54:24 GMT</pubDate></item></channel></rss>