<?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[Rückgabewerte]]></title><description><![CDATA[<p>Abend!</p>
<p>Ich habe 2 Fragen zu Rückgabewerten:</p>
<ol>
<li>Sagen wir ich habe eine Funktion, die eine Klasse by Value liefert:</li>
</ol>
<pre><code class="language-cpp">Data getData();
</code></pre>
<p>Wenn ich die nun einfach so fange:</p>
<pre><code class="language-cpp">Data d = getData();
</code></pre>
<p>Dann wird da doch vermutlich 2mal der CopyCtor aufgerufen, oder? Einmal um das Objekt zu returnen und dann um d zu konstrieren aus dem returnten Objekt.<br />
Wäre dann das hier performanter und empfehlenswerter?<br />
const Data&amp; d = getData();</p>
<ol start="2">
<li>Eine Frage zur Map. Sagen wir ich habe eine Map mit Vektoren als Value:<br />
map&lt;int, vector&lt;Foo&gt;&gt; m;<br />
Dann ist das ja ein CopyCtor Aufruf:<br />
Foo f = m[2];<br />
und das hier nicht, oder?<br />
const Foo&amp; f = m[2];<br />
Sollte ich dann auch hier immer den Wert mit einer konstanten Referenz fangen?</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/topic/285670/rückgabewerte</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 05:13:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/285670.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 25 Apr 2011 18:34:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Rückgabewerte on Mon, 25 Apr 2011 18:34:37 GMT]]></title><description><![CDATA[<p>Abend!</p>
<p>Ich habe 2 Fragen zu Rückgabewerten:</p>
<ol>
<li>Sagen wir ich habe eine Funktion, die eine Klasse by Value liefert:</li>
</ol>
<pre><code class="language-cpp">Data getData();
</code></pre>
<p>Wenn ich die nun einfach so fange:</p>
<pre><code class="language-cpp">Data d = getData();
</code></pre>
<p>Dann wird da doch vermutlich 2mal der CopyCtor aufgerufen, oder? Einmal um das Objekt zu returnen und dann um d zu konstrieren aus dem returnten Objekt.<br />
Wäre dann das hier performanter und empfehlenswerter?<br />
const Data&amp; d = getData();</p>
<ol start="2">
<li>Eine Frage zur Map. Sagen wir ich habe eine Map mit Vektoren als Value:<br />
map&lt;int, vector&lt;Foo&gt;&gt; m;<br />
Dann ist das ja ein CopyCtor Aufruf:<br />
Foo f = m[2];<br />
und das hier nicht, oder?<br />
const Foo&amp; f = m[2];<br />
Sollte ich dann auch hier immer den Wert mit einer konstanten Referenz fangen?</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/2054133</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2054133</guid><dc:creator><![CDATA[martiy2]]></dc:creator><pubDate>Mon, 25 Apr 2011 18:34:37 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabewerte on Mon, 25 Apr 2011 18:39:36 GMT]]></title><description><![CDATA[<ol>
<li></li>
</ol>
<pre><code class="language-cpp">const Data&amp; getData(void);
Data foo = getData();
</code></pre>
<ol start="2">
<li>Der Feldoperator gibt auch nur eine Referenz zurück.</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/2054136</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2054136</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Mon, 25 Apr 2011 18:39:36 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabewerte on Mon, 25 Apr 2011 18:48:40 GMT]]></title><description><![CDATA[<p>martiy2 schrieb:</p>
<blockquote>
<p>Abend!</p>
<p>Ich habe 2 Fragen zu Rückgabewerten:</p>
<ol>
<li>Sagen wir ich habe eine Funktion, die eine Klasse by Value liefert:</li>
</ol>
<pre><code class="language-cpp">Data getData();
</code></pre>
<p>Wenn ich die nun einfach so fange:</p>
<pre><code class="language-cpp">Data d = getData();
</code></pre>
<p>Dann wird da doch vermutlich 2mal der CopyCtor aufgerufen, oder? Einmal um das Objekt zu returnen und dann um d zu konstrieren aus dem returnten Objekt.<br />
Wäre dann das hier performanter und empfehlenswerter?<br />
const Data&amp; d = getData();</p>
</blockquote>
<p>Ja, dort hast du normalerweise zwei Kopien, wobei der Compiler das auch wegoptimieren kann (Stichwort (N)RVO)<br />
Die Alternative wird vermutlich nicht funktionieren, weil du dort eine Referenz auf eine temporäre Variable anlegst, die im nächsten Moment vernichtet wird.</p>
<blockquote>
<ol start="2">
<li>Eine Frage zur Map. Sagen wir ich habe eine Map mit Vektoren als Value:<br />
map&lt;int, vector&lt;Foo&gt;&gt; m;<br />
Dann ist das ja ein CopyCtor Aufruf:<br />
Foo f = m[2];<br />
und das hier nicht, oder?<br />
const Foo&amp; f = m[2];<br />
Sollte ich dann auch hier immer den Wert mit einer konstanten Referenz fangen?</li>
</ol>
</blockquote>
<p>Ja, des wäre eine Kopie, wenn der Code funktionieren würde<sup>*</sup> - und in dem Fall funktioniert der Ansatz mit der Referenz auch. Da kommt es halt auf deine Anwendung an, was du benötigst.</p>
<p><sup>*</sup>Deine Map enthält std::vector'en und wenn du nicht gerade einen Konstruktor <code>Foo::Foo(const vector&lt;Foo&gt;&amp;)</code> hast, wird deine Zuweisung nicht durch den Compiler gehen.</p>
<p>Edit <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/25179">@EOutOfResources</a>: Das funktioniert aber nur, wenn die Funktion keine lokalen Werte zurückgibt <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/2054140</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2054140</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 25 Apr 2011 18:48:40 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabewerte on Mon, 25 Apr 2011 19:05:18 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Edit <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/25179">@EOutOfResources</a>: Das funktioniert aber nur, wenn die Funktion keine lokalen Werte zurückgibt <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>
</blockquote>
<p>Bei einer Funktion die mit &quot;get&quot; beginnt... Ansonsten gibt es da noch die Movesemantics aus C++0x:</p>
<pre><code class="language-cpp">//Hier war ein Beispiel
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2054147</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2054147</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Mon, 25 Apr 2011 19:05:18 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabewerte on Mon, 25 Apr 2011 18:55:49 GMT]]></title><description><![CDATA[<p>Danke für die schnelle Antwort CStoll!</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>martiy2 schrieb:</p>
<blockquote>
<p>Abend!</p>
<p>Ich habe 2 Fragen zu Rückgabewerten:</p>
<ol>
<li>Sagen wir ich habe eine Funktion, die eine Klasse by Value liefert:</li>
</ol>
<pre><code class="language-cpp">Data getData();
</code></pre>
<p>Wenn ich die nun einfach so fange:</p>
<pre><code class="language-cpp">Data d = getData();
</code></pre>
<p>Dann wird da doch vermutlich 2mal der CopyCtor aufgerufen, oder? Einmal um das Objekt zu returnen und dann um d zu konstrieren aus dem returnten Objekt.<br />
Wäre dann das hier performanter und empfehlenswerter?<br />
const Data&amp; d = getData();</p>
</blockquote>
<p>Ja, dort hast du normalerweise zwei Kopien, wobei der Compiler das auch wegoptimieren kann (Stichwort (N)RVO)<br />
Die Alternative wird vermutlich nicht funktionieren, weil du dort eine Referenz auf eine temporäre Variable anlegst, die im nächsten Moment vernichtet wird.</p>
</blockquote>
<p>Meinst du mit Alternative das hier?:</p>
<pre><code class="language-cpp">Data getData();
const Data&amp; d = getData();
</code></pre>
<p>Das ist also gefährlich oder wie?</p>
<p>CStoll schrieb:</p>
<blockquote>
<blockquote>
<ol start="2">
<li>Eine Frage zur Map. Sagen wir ich habe eine Map mit Vektoren als Value:<br />
map&lt;int, vector&lt;Foo&gt;&gt; m;<br />
Dann ist das ja ein CopyCtor Aufruf:<br />
Foo f = m[2];<br />
und das hier nicht, oder?<br />
const Foo&amp; f = m[2];<br />
Sollte ich dann auch hier immer den Wert mit einer konstanten Referenz fangen?</li>
</ol>
</blockquote>
<p>Ja, des wäre eine Kopie, wenn der Code funktionieren würde<sup>*</sup> - und in dem Fall funktioniert der Ansatz mit der Referenz auch. Da kommt es halt auf deine Anwendung an, was du benötigst.</p>
<p><sup>*</sup>Deine Map enthält std::vector'en und wenn du nicht gerade einen Konstruktor <code>Foo::Foo(const vector&lt;Foo&gt;&amp;)</code> hast, wird deine Zuweisung nicht durch den Compiler gehen.</p>
</blockquote>
<p>Sorry, hab mich vertippt:/<br />
Nur zum Verständnis. Im Map-Fall gilt:</p>
<pre><code class="language-cpp">vector&lt;Foo&gt; f = m[2]; // 1 CopyCtor Aufruf
const vector&lt;Foo&gt;&amp; f2 = m[2]; // Garkein CopyCtor Aufruf. Performanter
</code></pre>
<p>Stimmt das so?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2054149</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2054149</guid><dc:creator><![CDATA[martiy2]]></dc:creator><pubDate>Mon, 25 Apr 2011 18:55:49 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabewerte on Mon, 25 Apr 2011 19:01:13 GMT]]></title><description><![CDATA[<p>EOutOfResources schrieb:</p>
<blockquote>
<p>Ansonsten gibt es da noch die Movesemantics aus C++0x:</p>
<pre><code class="language-cpp">struct Data
{
  int foo;
};
struct Bar
{
  int foo;
  Data&amp;&amp; getData(void) const
  {
    Data Temporary;
    Temporary.foo = this-&gt;foo;
    return Temporary;
  }
};
</code></pre>
</blockquote>
<p>Editier das mal schnell wieder weg, sonst kommt krümelkacker, wie es dir denn einfiehle, eine Referenz auf eine lokale Variable zurückzugeben. Eine Rückgabe von <code>Data</code> reicht, das Move macht der Compiler ganz automatisch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2054153</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2054153</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Mon, 25 Apr 2011 19:01:13 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabewerte on Mon, 25 Apr 2011 19:04:53 GMT]]></title><description><![CDATA[<p>ipsec schrieb:</p>
<blockquote>
<p>Editier das mal schnell wieder weg, sonst kommt krümelkacker, wie es dir denn einfiehle, eine Referenz auf eine lokale Variable zurückzugeben. Eine Rückgabe von <code>Data</code> reicht, das Move macht der Compiler ganz automatisch.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> OK.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2054159</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2054159</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Mon, 25 Apr 2011 19:04:53 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabewerte on Mon, 25 Apr 2011 19:10:39 GMT]]></title><description><![CDATA[<p>martiy2 schrieb:</p>
<blockquote>
<p>Danke für die schnelle Antwort CStoll!</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>martiy2 schrieb:</p>
<blockquote>
<p>Abend!</p>
<p>Ich habe 2 Fragen zu Rückgabewerten:</p>
<ol>
<li>Sagen wir ich habe eine Funktion, die eine Klasse by Value liefert:</li>
</ol>
<pre><code class="language-cpp">Data getData();
</code></pre>
<p>Wenn ich die nun einfach so fange:</p>
<pre><code class="language-cpp">Data d = getData();
</code></pre>
<p>Dann wird da doch vermutlich 2mal der CopyCtor aufgerufen, oder? Einmal um das Objekt zu returnen und dann um d zu konstrieren aus dem returnten Objekt.<br />
Wäre dann das hier performanter und empfehlenswerter?<br />
const Data&amp; d = getData();</p>
</blockquote>
<p>Ja, dort hast du normalerweise zwei Kopien, wobei der Compiler das auch wegoptimieren kann (Stichwort (N)RVO)<br />
Die Alternative wird vermutlich nicht funktionieren, weil du dort eine Referenz auf eine temporäre Variable anlegst, die im nächsten Moment vernichtet wird.</p>
</blockquote>
<p>Meinst du mit Alternative das hier?:</p>
<pre><code class="language-cpp">Data getData();
const Data&amp; d = getData();
</code></pre>
<p>Das ist also gefährlich oder wie?</p>
</blockquote>
<p>Ja, das ist gefährlich: Der Compiler legt eine temporäre Variable an, um den Rückgabewert aufzunehmen. Diese Variable wird am Ende der Anweisung wieder vernichtet. Wenn du eine Referenz auf diese Variable aufhebst, zeigt diese anschließend nur auf Datenmüll.<br />
(mit NRVO spart der Compiler diese temporäre Variable ein und verwendet die lokale Variable, die aus der Funktion zurückgegeben wurde - aber die überlebt auch nicht länger)</p>
<p>Bei der map&lt;&gt; liegt der Fall ein wenig günstiger - der Index-Operator gibt eine Referenz auf das Element zurück, da überlebt das referenzierte Objekt lange genug, um damit arbeiten zu können (zumindest solange du es nicht löschst).</p>
<p>EOutOfResources schrieb:</p>
<blockquote>
<p>CStoll schrieb:</p>
<blockquote>
<p>Edit <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/25179">@EOutOfResources</a>: Das funktioniert aber nur, wenn die Funktion keine lokalen Werte zurückgibt <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>
</blockquote>
<p>Bei einer Funktion die mit &quot;get&quot; beginnt...</p>
</blockquote>
<p>Auch eine get-Funktion könnte die zurückgegebenen Werte lokal berechnen <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/2054164</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2054164</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 25 Apr 2011 19:10:39 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabewerte on Mon, 25 Apr 2011 19:17:59 GMT]]></title><description><![CDATA[<p>Ok, dann schreibe ich also einfach<br />
Data foo = getData();<br />
und bete, dass der Compiler NRVO anwendet?</p>
<p>Ich frage nur deshalb, weil der CopyCtor von Data ziemlich aufwändig ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2054171</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2054171</guid><dc:creator><![CDATA[martiy2]]></dc:creator><pubDate>Mon, 25 Apr 2011 19:17:59 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabewerte on Mon, 25 Apr 2011 19:19:13 GMT]]></title><description><![CDATA[<p>martiy2 schrieb:</p>
<blockquote>
<p>Ich frage nur deshalb, weil der CopyCtor von Data ziemlich aufwändig ist.</p>
</blockquote>
<p>Nein. Aufwändig ist er sicher nicht! Vielleicht ist er aufwendig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2054176</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2054176</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Mon, 25 Apr 2011 19:19:13 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabewerte on Mon, 25 Apr 2011 19:20:37 GMT]]></title><description><![CDATA[<p>EOutOfResources schrieb:</p>
<blockquote>
<p>martiy2 schrieb:</p>
<blockquote>
<p>Ich frage nur deshalb, weil der CopyCtor von Data ziemlich aufwändig ist.</p>
</blockquote>
<p>Nein. Aufwändig ist er sicher nicht! Vielleicht ist er aufwendig.</p>
</blockquote>
<p>Er wollte nur sagen, daß dazu Aufwend betrieben wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2054180</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2054180</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 25 Apr 2011 19:20:37 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabewerte on Mon, 25 Apr 2011 19:21:32 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Er wollte nur sagen, daß dazu Aufwend betrieben wird.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2054182</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2054182</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Mon, 25 Apr 2011 19:21:32 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabewerte on Mon, 25 Apr 2011 19:26:16 GMT]]></title><description><![CDATA[<p>EOutOfResources schrieb:</p>
<blockquote>
<p>martiy2 schrieb:</p>
<blockquote>
<p>Ich frage nur deshalb, weil der CopyCtor von Data ziemlich aufwändig ist.</p>
</blockquote>
<p>Nein. Aufwändig ist er sicher nicht! Vielleicht ist er aufwendig.</p>
</blockquote>
<p>Ein kurzes googlen verrät dir: dank neuer Rechtschreibung ist der Kommentar totaler Käse.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2054187</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2054187</guid><dc:creator><![CDATA[lambordschinni]]></dc:creator><pubDate>Mon, 25 Apr 2011 19:26:16 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabewerte on Mon, 25 Apr 2011 19:31:46 GMT]]></title><description><![CDATA[<p>Irgendwie ist EOutOfResources schon extrem peinlich. Erst postet er schwachsinniges Zeugs, dann will er Klugscheißen und Rechtschreibflamen und schießt auch noch ein rießiges Eigentor und jetzt isser sogar zu blöd um das zu merken. Was für ein Clown.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2054194</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2054194</guid><dc:creator><![CDATA[AmüsierterMitleser]]></dc:creator><pubDate>Mon, 25 Apr 2011 19:31:46 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabewerte on Mon, 25 Apr 2011 19:34:39 GMT]]></title><description><![CDATA[<p>AmüsierterMitleser schrieb:</p>
<blockquote>
<p>Erst postet er schwachsinniges Zeugs,</p>
</blockquote>
<p>Wo?</p>
<p>AmüsierterMitleser schrieb:</p>
<blockquote>
<p>jetzt isser sogar zu blöd um das zu merken.</p>
</blockquote>
<p>Wo?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2054199</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2054199</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Mon, 25 Apr 2011 19:34:39 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabewerte on Mon, 25 Apr 2011 19:40:17 GMT]]></title><description><![CDATA[<p>Dann möchte ich noch <a href="http://www.duden.de/definition/einwenden" rel="nofollow">http://www.duden.de/definition/einwenden</a> einwänden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2054204</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2054204</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 25 Apr 2011 19:40:17 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabewerte on Mon, 25 Apr 2011 19:40:59 GMT]]></title><description><![CDATA[<p>Omg, selbst jetzt rafft er es noch nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>EOutOfResources schrieb:</p>
<blockquote>
<p>AmüsierterMitleser schrieb:</p>
<blockquote>
<p>Erst postet er schwachsinniges Zeugs,</p>
</blockquote>
<p>Wo?<br />
Alles bis jetzt? Der falsche Tipp mit der const Referenz beim get. Der falsche Movesemantics tipp, den du nachträglich wegeditiert hast.</p>
<p>AmüsierterMitleser schrieb:</p>
<blockquote>
<p>jetzt isser sogar zu blöd um das zu merken.</p>
</blockquote>
<p>Wo?</p>
</blockquote>
<p>Du hast das Posting von volkard offenbar noch immer nicht verstanden. Oh man.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2054205</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2054205</guid><dc:creator><![CDATA[AmüsierterMitleser]]></dc:creator><pubDate>Mon, 25 Apr 2011 19:40:59 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabewerte on Mon, 25 Apr 2011 20:06:19 GMT]]></title><description><![CDATA[<p>martiy2 schrieb:</p>
<blockquote>
<p>Ok, dann schreibe ich also einfach<br />
Data foo = getData();<br />
und bete, dass der Compiler NRVO anwendet?</p>
<p>Ich frage nur deshalb, weil der CopyCtor von Data ziemlich aufwändig ist.</p>
</blockquote>
<p>Das wäre die sinnvollste Methode. Ich erwarte eigentlich von jedem modernen Compiler, dass er die Kopie an dieser Stelle zumindest mit entsprechenden Optimierungsschaltern unterlässt und das Objekt gleich an der richtigen Stelle konstruiert.</p>
<p>Übrigens - nur um das richtigzustellen:</p>
<pre><code class="language-cpp">Data getData();
const Data&amp; d = getData();
</code></pre>
<p>ist legaler Code. Die Zerstörung des temporären Objektes (des Rückgabewertes) wird hier verzögert, so lange die Referenz besteht. Nachzulesen im Standard, 12.2 (5). Wichtig dabei ist, dass es nur um die ursprüngliche Referenz geht. Beispielsweise kannst du nicht</p>
<pre><code class="language-cpp">struct foo {
  foo(Data const &amp;data) : data_(data) { }
  Data const &amp;data_;
};

foo f(getData());
</code></pre>
<p>schreiben, weil das temporäre Objekt nach Ende des Kopierkonstruktors - also wenn die Referenz, an die es usrprünglich gebunden wurde, seine Gültigkeit verliert - zerstört wird. Die genauen Regeln im Standard sind einigermaßen komplex, und es steht nicht zu erwarten, dass man mit diesem Trick auf neueren Compilern Laufzeit sparen kann, also kann ich diese Praxis nicht empfehlen. Gleichwohl ist sie prinzipiell erlaubt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2054221</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2054221</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Mon, 25 Apr 2011 20:06:19 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabewerte on Wed, 27 Apr 2011 08:39:10 GMT]]></title><description><![CDATA[<p>AmüsierterMitleser schrieb:</p>
<blockquote>
<p>Irgendwie ist EOutOfResources schon extrem peinlich. Erst postet er schwachsinniges Zeugs, dann will er Klugscheißen und Rechtschreibflamen und schießt auch noch ein <strong>rießiges</strong> Eigentor und jetzt isser sogar zu blöd um das zu merken. Was für ein Clown.</p>
</blockquote>
<p>Self level?<br />
Gibt so´n Spruch mit Glashaus und Stein und so...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2054908</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2054908</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Wed, 27 Apr 2011 08:39:10 GMT</pubDate></item></channel></rss>