<?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[Bringt es etwas Funktionen für const T&amp;amp; und T&amp;amp;&amp;amp; zu überladen?]]></title><description><![CDATA[<p>Frage steht im Prinzip oben.<br />
Bringt es einen Geschwindigkeitsvorteil, wenn man eine Funktion für L- und RValues zu überladen oder ist das egal?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/312732/bringt-es-etwas-funktionen-für-const-t-amp-und-t-amp-amp-zu-überladen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 02 Aug 2026 19:36:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/312732.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 12 Jan 2013 18:31:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Bringt es etwas Funktionen für const T&amp;amp; und T&amp;amp;&amp;amp; zu überladen? on Sat, 12 Jan 2013 18:31:06 GMT]]></title><description><![CDATA[<p>Frage steht im Prinzip oben.<br />
Bringt es einen Geschwindigkeitsvorteil, wenn man eine Funktion für L- und RValues zu überladen oder ist das egal?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2289074</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289074</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sat, 12 Jan 2013 18:31:06 GMT</pubDate></item><item><title><![CDATA[Reply to Bringt es etwas Funktionen für const T&amp;amp; und T&amp;amp;&amp;amp; zu überladen? on Sat, 12 Jan 2013 18:41:13 GMT]]></title><description><![CDATA[<p>Du hast letztlich diese drei Möglichkeiten:</p>
<pre><code>void foo(const my_type&amp; v); // copy
void foo(const my_type&amp;&amp; v); //move
</code></pre>
<pre><code>template &lt;typename T&gt;
void foo(T&amp;&amp; v); // beides, siehe reference collapsing
</code></pre>
<pre><code>void foo(my_type v); // beides, braucht copy+move oder move+move
</code></pre>
<p>Die erste Variante braucht zwei Implementierungen. Bei der zweiten muss die Implementierung im Header stehen, und bringt die üblichen Template Probleme mit sich. (Schlechte Fehlermeldungen.)<br />
Die dritte Variante ist etwas langsamer, aber wenn man davon ausgeht, dass move nahezu gratis ist, ist es wohl die beste Variante.<br />
Insofern würde zu 1. raten, wenn man über move Performance besorgt ist, zum zweitem wenn's ne reine forward Funktion für alles ist und sonst zur dritten Variante.<br />
Sobald C++17 raus ist und wir modules und concepts haben, sind die Template Probleme weg, dann rate ich immer zu 2. Aber das dauert halt noch. <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/2289076</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289076</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sat, 12 Jan 2013 18:41:13 GMT</pubDate></item><item><title><![CDATA[Reply to Bringt es etwas Funktionen für const T&amp;amp; und T&amp;amp;&amp;amp; zu überladen? on Sat, 12 Jan 2013 18:42:56 GMT]]></title><description><![CDATA[<p>soweit wie ich das bisher verstanden habe, sollte man wie bisher für &quot;const t&amp;&quot; und zusätzlich für nonconst &quot;T&amp;&amp;&quot; überladen. der rvalue ist ein temp. Objekt, wo man nicht kopieren muß, sondern verschieben kann (move semantics, z.B. Pointer austauschen statt Inhalt kopieren), das temp. Objekt wird am Ende des &quot;full expression&quot; zerstört und nicht weiterverwendet</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2289077</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289077</guid><dc:creator><![CDATA[dd++ 0]]></dc:creator><pubDate>Sat, 12 Jan 2013 18:42:56 GMT</pubDate></item><item><title><![CDATA[Reply to Bringt es etwas Funktionen für const T&amp;amp; und T&amp;amp;&amp;amp; zu überladen? on Sat, 12 Jan 2013 20:15:36 GMT]]></title><description><![CDATA[<p>dd++: Du kannst nun beide Fälle mit einer Überladung abdecken, die den Parameter per Value als <code>T</code> nimmt (natürlich nicht const). Man sollte immer diese Variante wählen, ausser es spricht einer der von cooky451 genannten Gründe dagegen.</p>
<p>In den Fällen, wo die in diesem Thread gestellte Frage überhaupt auftritt, geht es nur darum, Besitz an eine Funktion zu übertragen. Bei reinem Lesezugriff verwendet man weiterhin <code>const T&amp;</code> für grosse Objekte und <code>T</code> für kleine.</p>
<p><code>T&amp;&amp;</code> (als Template oder nicht) braucht man ziemlich selten. Und zwar als Parameter bei Move-Konstruktoren, Move-Zuweisungsoperatoren und Forwarding-Funktionen. Als Rückgabetyp kommt es so gut wie gar nie vor.</p>
<p>&lt;<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    />&gt;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2289099</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289099</guid><dc:creator><![CDATA[glühbirne]]></dc:creator><pubDate>Sat, 12 Jan 2013 20:15:36 GMT</pubDate></item><item><title><![CDATA[Reply to Bringt es etwas Funktionen für const T&amp;amp; und T&amp;amp;&amp;amp; zu überladen? on Sat, 12 Jan 2013 20:17:42 GMT]]></title><description><![CDATA[<p>Bei move-assignment wird's spannend. <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/2289100</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289100</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sat, 12 Jan 2013 20:17:42 GMT</pubDate></item><item><title><![CDATA[Reply to Bringt es etwas Funktionen für const T&amp;amp; und T&amp;amp;&amp;amp; zu überladen? on Sat, 12 Jan 2013 20:23:41 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Frage steht im Prinzip oben.<br />
Bringt es einen Geschwindigkeitsvorteil, wenn man eine Funktion für L- und RValues zu überladen oder ist das egal?</p>
</blockquote>
<p>Das kommt drauf an. In einigen Situationen hilft es, in anderen ist es sinnfrei. std::vector&lt;T&gt;::push_back ist beispielsweise so überladen, weil dadurch ggf eine unnötige Kopie verhindert werden kann. Bei solchen Templates ist das sinnvoll, weil T ja nicht move-optimiert sein muss und logisch gesehen man eine &quot;Kopie&quot; erzeugen will. An anderen Stellen kann man das mit den Referenzen aber auch sein lassen, hier z.B.:</p>
<pre><code class="language-cpp">class dings
{
public:
  explicit dings(string s); // &lt;-- nix mit Referenz
private:
  string bums;
  :::
};

dings::dings(string s)
: bums(move(s))
, :::
{
  :::
}
</code></pre>
<p>Eine unnötige Kopie gibt es hier nicht, da std::string ja move-optimiert ist. Aber mit einer Überladung oder Perfect Forwarding könnte man sich noch eine ggf unnötige Move-Konstruktion sparen. Aber das lohnt sich eigentlich nicht, weil 'ne Move-Konstruktion von std::string eh recht flott ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2289102</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289102</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 12 Jan 2013 20:23:41 GMT</pubDate></item><item><title><![CDATA[Reply to Bringt es etwas Funktionen für const T&amp;amp; und T&amp;amp;&amp;amp; zu überladen? on Sat, 12 Jan 2013 23:12:04 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Bei move-assignment wird's spannend. <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>Den Zuweisungsoperator könnte man theoretisch über Pass by Value implementieren. Aber bringt das überhaupt etwas?</p>
<p>Solche Definitionen werden vom Compiler wahrscheinlich weder als Copy- noch Move-Assignment erkannt...</p>
<pre><code>X&amp; X::operator= (X source)
{
    swap(source);
    return *this;
}
</code></pre>
<p>&lt;<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    />&gt;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2289163</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289163</guid><dc:creator><![CDATA[glühbirne]]></dc:creator><pubDate>Sat, 12 Jan 2013 23:12:04 GMT</pubDate></item><item><title><![CDATA[Reply to Bringt es etwas Funktionen für const T&amp;amp; und T&amp;amp;&amp;amp; zu überladen? on Sat, 12 Jan 2013 23:37:24 GMT]]></title><description><![CDATA[<p>Laut Standard ist es ein copy constructor. Aber &quot;get-value-and-swap&quot; funktioniert halt für copy und für move. Deswegen sagte ich ja, da wird's interessant. Es ist irgendwie elegant, aber ich weiß noch nicht 100%ig was ich davon halten soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2289165</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289165</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sat, 12 Jan 2013 23:37:24 GMT</pubDate></item><item><title><![CDATA[Reply to Bringt es etwas Funktionen für const T&amp;amp; und T&amp;amp;&amp;amp; zu überladen? on Sun, 13 Jan 2013 08:47:30 GMT]]></title><description><![CDATA[<p>eine gute Einführung in das Thema gibt es z.B. hier:</p>
<p><a href="http://www.cprogramming.com/c++11/rvalue-references-and-move-semantics-in-c++11.html" rel="nofollow">http://www.cprogramming.com/c++11/rvalue-references-and-move-semantics-in-c++11.html</a></p>
<p>ich habe hier mal zum Basteln ein kleines Testprogramm, viel Spaß!</p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

class MyInt
  {
public:
  MyInt()
    { m_Value = 0;
      cout &lt;&lt; &quot;MyInt() &quot;; Cout(); }
  MyInt(const MyInt&amp; myCopy)
    { m_Value = myCopy.m_Value;
      cout &lt;&lt; &quot;MyInt(c&amp; &quot; &lt;&lt; &amp;myCopy &lt;&lt; &quot;) &quot;; Cout(); }
  MyInt(MyInt&amp;&amp; myCopy)
    { m_Value = myCopy.m_Value;
      cout &lt;&lt; &quot;MyInt(&amp;&amp; &quot; &lt;&lt; &amp;myCopy &lt;&lt; &quot;) &quot;; Cout(); }
  MyInt(int i)
    { m_Value = i;
      cout &lt;&lt; &quot;MyInt(&quot; &lt;&lt; i &lt;&lt; &quot;) &quot;; Cout(); }
  ~MyInt()
    { cout &lt;&lt; &quot;~MyInt() &quot;; Cout(); }
  MyInt&amp; operator=(const MyInt&amp; myCopy)
    { m_Value = myCopy.m_Value;
      cout &lt;&lt; &quot;operator=(c&amp; &quot; &lt;&lt; &amp;myCopy &lt;&lt; &quot;) &quot;; Cout();
      return *this; }
  MyInt&amp; operator=(MyInt&amp;&amp; myCopy)
    { m_Value = myCopy.m_Value;
      cout &lt;&lt; &quot;operator=(&amp;&amp; &quot; &lt;&lt; &amp;myCopy &lt;&lt; &quot;) &quot;; Cout();
      return *this; }
  void setValue(int i)
    { m_Value = i;
      cout &lt;&lt; &quot;setValue(&quot; &lt;&lt; i &lt;&lt; &quot;) &quot;; Cout(); }
private:
  void Cout()
    { cout &lt;&lt; m_Value &lt;&lt; &quot; &quot; &lt;&lt; this &lt;&lt; endl; }
  int m_Value;
  };

MyInt f()
  { MyInt myInt; myInt.setValue(11); return myInt; }

int main ()
  {
  { MyInt myInt; }
  cout &lt;&lt; &quot;--- MyInt myInt;&quot; &lt;&lt; endl;
  { f(); }
  cout &lt;&lt; &quot;--- f();&quot; &lt;&lt; endl;
  { MyInt myInt(f()); }
  cout &lt;&lt; &quot;--- MyInt myInt(f());&quot; &lt;&lt; endl;
  { MyInt myInt1(7); MyInt myInt2(myInt1); }
  cout &lt;&lt; &quot;--- MyInt myInt1(7); MyInt myInt2(myInt1);&quot; &lt;&lt; endl;
  return 0;
  }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2289204</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289204</guid><dc:creator><![CDATA[dd++ 0]]></dc:creator><pubDate>Sun, 13 Jan 2013 08:47:30 GMT</pubDate></item><item><title><![CDATA[Reply to Bringt es etwas Funktionen für const T&amp;amp; und T&amp;amp;&amp;amp; zu überladen? on Sun, 13 Jan 2013 16:34:02 GMT]]></title><description><![CDATA[<p>Danke, jetzt ist mir einiges klar geworden.<br />
Ich kannte Movesemantik schon vorher, habe sie bisher aber nur benutzt und keine eigenen Beispiele geschrieben. Was Reference Collapsing etc. ist wusste ich schon vorher, aber trotzdem 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="🙂"
    /><br />
Ich werde in der Regel einfach foo(T obj) verwenden, nur bei großen Objekten (Container, Bilder, etc.) beide Funktionen schreiben.<br />
lg<br />
Nathan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2289305</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289305</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sun, 13 Jan 2013 16:34:02 GMT</pubDate></item><item><title><![CDATA[Reply to Bringt es etwas Funktionen für const T&amp;amp; und T&amp;amp;&amp;amp; zu überladen? on Sun, 13 Jan 2013 16:53:37 GMT]]></title><description><![CDATA[<p>Wie groß die Objekte sind ist dabei eigentlich eher uninteressant. (Jedenfalls wenn du vector&lt;&gt; für groß hälst - wenn du sizeof meinst, mein Fehler.) Da du ja movest, zählt nur wie viele Handles das Objekt hat, und wie oft die Funktion aufgerufen wird (ohne dass sie geinlined wird). Bei einem Handle auf 500MB macht's wahrscheinlich kaum einen Unterschied, bei 50 auf je 16 Byte schon. <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/2289307</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289307</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sun, 13 Jan 2013 16:53:37 GMT</pubDate></item><item><title><![CDATA[Reply to Bringt es etwas Funktionen für const T&amp;amp; und T&amp;amp;&amp;amp; zu überladen? on Sun, 13 Jan 2013 17:01:19 GMT]]></title><description><![CDATA[<p>Nein, ich meinte nicht sizeof.<br />
Da fällt mir gerade was anderes ein:<br />
Move bei Pointern ist ja im Prinzip nur</p>
<pre><code>ptr = othr.ptr; othr.ptr = nullptr;
</code></pre>
<p>oder?<br />
Wie handhabst du das denn bei großen Objekten, die an Funktionen übergeben werden müssen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2289308</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289308</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sun, 13 Jan 2013 17:01:19 GMT</pubDate></item><item><title><![CDATA[Reply to Bringt es etwas Funktionen für const T&amp;amp; und T&amp;amp;&amp;amp; zu überladen? on Sun, 13 Jan 2013 17:10:24 GMT]]></title><description><![CDATA[<p>Wie.. meinst du das jetzt? Welche Art von Groß? <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2289316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289316</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sun, 13 Jan 2013 17:10:24 GMT</pubDate></item><item><title><![CDATA[Reply to Bringt es etwas Funktionen für const T&amp;amp; und T&amp;amp;&amp;amp; zu überladen? on Sun, 13 Jan 2013 17:17:58 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Wie handhabst du das denn bei großen Objekten, die an Funktionen übergeben werden müssen?</p>
</blockquote>
<p>Drück dich klarer aus. Wird <em>der Besitz</em> an die Funktion übergeben?</p>
<p>Falls ja: Klasse movable machen. Wenn das nicht geht oder immer noch teuer ist, Objekt in eine Movable-Klasse wie <code>std::unique_ptr</code> stecken. In beiden Fällen Pass By Value.</p>
<p>Falls nein: Const-Referenz wie in C++98.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2289319</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289319</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 13 Jan 2013 17:17:58 GMT</pubDate></item><item><title><![CDATA[Reply to Bringt es etwas Funktionen für const T&amp;amp; und T&amp;amp;&amp;amp; zu überladen? on Sun, 13 Jan 2013 17:20:20 GMT]]></title><description><![CDATA[<p>Ich meinte Besitzübertragung.<br />
Danke für die Erklärung Nexus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2289321</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2289321</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sun, 13 Jan 2013 17:20:20 GMT</pubDate></item></channel></rss>