<?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[shared_ptr per Wert oder Referenz]]></title><description><![CDATA[<p>Hallo,</p>
<p>macht es Unterschied (bzgl. Performance) shared_ptr per Wert oder Referenz zu übergeben?</p>
<p>Vielen Dank</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/323237/shared_ptr-per-wert-oder-referenz</link><generator>RSS for Node</generator><lastBuildDate>Thu, 16 Jul 2026 06:51:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/323237.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 22 Jan 2014 11:16:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to shared_ptr per Wert oder Referenz on Wed, 22 Jan 2014 11:16:20 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>macht es Unterschied (bzgl. Performance) shared_ptr per Wert oder Referenz zu übergeben?</p>
<p>Vielen Dank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2378913</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2378913</guid><dc:creator><![CDATA[DKlay]]></dc:creator><pubDate>Wed, 22 Jan 2014 11:16:20 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr per Wert oder Referenz on Wed, 22 Jan 2014 11:19:54 GMT]]></title><description><![CDATA[<p>ja, der Referenzcounter wird erhöht und am Ende wieder dekrementiert. Das kostet Performance, auch wenn das vermutlich nicht signifikant spürbar sein wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2378914</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2378914</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Wed, 22 Jan 2014 11:19:54 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr per Wert oder Referenz on Wed, 22 Jan 2014 11:30:26 GMT]]></title><description><![CDATA[<p>daddy_felix schrieb:</p>
<blockquote>
<p>ja, der Referenzcounter wird erhöht und am Ende wieder dekrementiert. Das kostet Performance, auch wenn das vermutlich nicht signifikant spürbar sein wird.</p>
</blockquote>
<p>also das gilt wenn der shared_ptr als kopie übergeben wird, nur um das klar zu stellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2378915</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2378915</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Wed, 22 Jan 2014 11:30:26 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr per Wert oder Referenz on Wed, 22 Jan 2014 11:32:46 GMT]]></title><description><![CDATA[<p>daddy_felix schrieb:</p>
<blockquote>
<p>ja, der Referenzcounter wird erhöht und am Ende wieder dekrementiert. Das kostet Performance, auch wenn das vermutlich nicht signifikant spürbar sein wird.</p>
</blockquote>
<p>OK vielen Dank. Also ist per Referenz vorzuziehen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2378918</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2378918</guid><dc:creator><![CDATA[DKlay]]></dc:creator><pubDate>Wed, 22 Jan 2014 11:32:46 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr per Wert oder Referenz on Wed, 22 Jan 2014 11:55:57 GMT]]></title><description><![CDATA[<p>DKlay schrieb:</p>
<blockquote>
<p>OK vielen Dank. Also ist per Referenz vorzuziehen</p>
</blockquote>
<p>Wenn du die Besitzübertragung nicht brauchst, kannst du das machen. Aber dann könntest du auch gleich eine Referenz auf das Objekt übergeben, das am shared_ptr hängt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2378920</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2378920</guid><dc:creator><![CDATA[TNA]]></dc:creator><pubDate>Wed, 22 Jan 2014 11:55:57 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr per Wert oder Referenz on Wed, 22 Jan 2014 12:46:00 GMT]]></title><description><![CDATA[<blockquote>
<p>if you have a shiny new hammer everything looks like a nail</p>
</blockquote>
<p>Dein &quot;shiny new hammer&quot; sind smart pointer?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2378929</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2378929</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Wed, 22 Jan 2014 12:46:00 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr per Wert oder Referenz on Wed, 22 Jan 2014 12:56:54 GMT]]></title><description><![CDATA[<p>Und dein rusty old hammer sind blöde Kommentare <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2378932</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2378932</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 22 Jan 2014 12:56:54 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr per Wert oder Referenz on Wed, 22 Jan 2014 12:59:47 GMT]]></title><description><![CDATA[<p>TNA schrieb:</p>
<blockquote>
<p>DKlay schrieb:</p>
<blockquote>
<p>OK vielen Dank. Also ist per Referenz vorzuziehen</p>
</blockquote>
<p>Wenn du die Besitzübertragung nicht brauchst, kannst du das machen. Aber dann könntest du auch gleich eine Referenz auf das Objekt übergeben, das am shared_ptr hängt.</p>
</blockquote>
<p>Sorry, aber das ist Unsinn.</p>
<p>Wenn man shared ownership braucht, dann braucht mans halt.<br />
Und man kann dabei natürlich auch nen <code>shared_ptr const&amp;</code> übergeben. Die Funktion die auch &quot;Mitbesitzer&quot; werden will kopiert sich aus der Referenz eben einen eigenen** <code>shared</code> ** <code>_ptr</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2378934</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2378934</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 22 Jan 2014 12:59:47 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr per Wert oder Referenz on Wed, 22 Jan 2014 13:03:35 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Wenn man shared ownership braucht, dann braucht mans halt.<br />
Und man kann dabei natürlich auch nen <code>shared_ptr const&amp;</code> übergeben. Die Funktion die auch &quot;Mitbesitzer&quot; werden will kopiert sich aus der Referenz eben einen eigenen** <code>shared</code> ** <code>_ptr</code> .</p>
</blockquote>
<p>Wenn die Funktion wirklich &quot;Mitbesitzer&quot; werden will, sollte das optimalerweise schon aus der Signatur klar werden. Das übergeben &quot;per value&quot; hat dann auch den Vorteil, dass man move-Semantik ausnutzen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2378935</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2378935</guid><dc:creator><![CDATA[TNA]]></dc:creator><pubDate>Wed, 22 Jan 2014 13:03:35 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr per Wert oder Referenz on Wed, 22 Jan 2014 13:04:32 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<blockquote>
<p>if you have a shiny new hammer everything looks like a nail</p>
</blockquote>
<p>Dein &quot;shiny new hammer&quot; sind smart pointer?</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /> also ich arbeite mich gerade rein in C++, und klar es gibt Situation wo man smart pointer nicht braucht...aber die Frage hat mich brennend interessiert!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2378936</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2378936</guid><dc:creator><![CDATA[DKlay]]></dc:creator><pubDate>Wed, 22 Jan 2014 13:04:32 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr per Wert oder Referenz on Wed, 22 Jan 2014 13:17:32 GMT]]></title><description><![CDATA[<p>DKlay schrieb:</p>
<blockquote>
<p>Hallo,</p>
<p>macht es Unterschied (bzgl. Performance) shared_ptr per Wert oder Referenz zu übergeben?</p>
</blockquote>
<p>Ja.</p>
<p>Und die Antwort auf die Folgefrage &quot;Wie soll ich einen shared_ptr übergeben? Per Wert oder Referenz?&quot; ist &quot;Kommt drauf an.&quot;</p>
<p>Bei Typen, die leicht movable sind und wo das Kopieren teurer ist, verwende ich gerne pass-by-value, wenn ich mir damit u.U. eine Kopie sparen kann. Das kommt z.B. dann vor, wenn eine Funktion oder ein Konstruktor eine &quot;Kopie&quot; eines solchen Objekts irgendwo anders wegspeichern will. Beispiel:</p>
<pre><code class="language-cpp">class foo
{
public:
    explicit foo(shared_ptr&lt;bar&gt; b)
    : c(move(b))
    {}
private:
    shared_ptr&lt;bar&gt; c;
};
</code></pre>
<p>Das schöne hier ist, dass der Nutzercode explizit keine Kopie anlegt. Er &quot;move't&quot; nur <code>b</code> nach <code>c</code> . Das Kopieren wird hier dem Compiler überlassen. Der kann das ggf wegoptimieren oder auch den Move-Konstruktor bemühen, um <code>b</code> zu erzeugen. Gleiches gilt auch für viele andere Typen, std::string, std::vector&lt;&gt;, etc. Sie sind relativ billig move-bar und typischerweise teuer zu kopieren.</p>
<p>Und wenn Du innerhalb der Funktion nur auf das Objekt zugreifen willst, worauf der shared_ptr zeigt, dann solltest Du wahrscheinlich direkt eine Referenz übergeben (ohne shared_ptr dazwischen):</p>
<pre><code class="language-cpp">void foo(vector&lt;int&gt; &amp; ref)
{
   ...
}

void bar()
{
   shared_ptr&lt;vector&lt;int&gt;&gt; sp = ...;
   foo(*sp);
}
</code></pre>
<p>Es mag aber auch Fälle geben, wo die Übergabe</p>
<pre><code class="language-cpp">void foo(shared_ptr&lt;vector&lt;int&gt;&gt; const&amp; ptr)
</code></pre>
<p>sinnvoll ist. Da fällt mir zwar gerade nichts zu ein, aber ausschließen will ich das jetzt nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2378937</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2378937</guid><dc:creator><![CDATA[kkaw]]></dc:creator><pubDate>Wed, 22 Jan 2014 13:17:32 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr per Wert oder Referenz on Wed, 22 Jan 2014 15:25:36 GMT]]></title><description><![CDATA[<blockquote>
<p>aber ausschließen will ich das jetzt nicht.</p>
</blockquote>
<p>Angsthase <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>
<blockquote>
<p>klar es gibt Situation wo man smart pointer nicht braucht</p>
</blockquote>
<p>Das impliziert (fuer mich), dass der Gebrauch von smart pointer die Regel bzw. best practice ist und selten rohe Zeiger benutzt werden sollten. Dem widerspreche ich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2378951</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2378951</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Wed, 22 Jan 2014 15:25:36 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr per Wert oder Referenz on Wed, 22 Jan 2014 14:55:56 GMT]]></title><description><![CDATA[<p>Wenn derjenige, der den Pointer übergeben bekommt, Besitz von der mit dem Pointer verbundenen Ressource ergreift, dann würde ich den Pointer per Wert übergeben, um dies im Interface auszudrücken. Wenn nicht, würde ich mich fragen, wieso überhaupt ein shared_ptr übergeben weden sollte...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2378965</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2378965</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Wed, 22 Jan 2014 14:55:56 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr per Wert oder Referenz on Wed, 22 Jan 2014 18:57:15 GMT]]></title><description><![CDATA[<p>TNA schrieb:</p>
<blockquote>
<p>Wenn die Funktion wirklich &quot;Mitbesitzer&quot; werden will, sollte das optimalerweise schon aus der Signatur klar werden.</p>
</blockquote>
<p>Wird es aber nicht.</p>
<p>Wenn man nämlich Ownership-sharing <em>nicht</em> ermöglichen will, dann kann man der Funktion in den allermeisten Fällen nämlich gleich nen Raw-Pointer übergeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2379006</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2379006</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 22 Jan 2014 18:57:15 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr per Wert oder Referenz on Wed, 22 Jan 2014 20:51:57 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Wenn man nämlich Ownership-sharing <em>nicht</em> ermöglichen will, dann kann man der Funktion in den allermeisten Fällen nämlich gleich nen Raw-Pointer übergeben.</p>
</blockquote>
<p>Damit wäre ja dann alles beredet =&gt; shared_ptrs per value übergeben.<br />
Spart die Kopie, wenn direkt mit make_shared() als Argument aufgerufen, andernfälls hätte die Funktion sicher sowieso kopiert oder hätte andernfalls einen Raw-Pointer genommen und man spart sich das hässliche const&amp; zu tippen, also Win &amp; Win.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2379046</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2379046</guid><dc:creator><![CDATA[qwas]]></dc:creator><pubDate>Wed, 22 Jan 2014 20:51:57 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr per Wert oder Referenz on Wed, 22 Jan 2014 23:03:41 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>TNA schrieb:</p>
<blockquote>
<p>Wenn die Funktion wirklich &quot;Mitbesitzer&quot; werden will, sollte das optimalerweise schon aus der Signatur klar werden.</p>
</blockquote>
<p>Wird es aber nicht.</p>
<p>Wenn man nämlich Ownership-sharing <em>nicht</em> ermöglichen will, dann kann man der Funktion in den allermeisten Fällen nämlich gleich nen Raw-Pointer übergeben.</p>
</blockquote>
<p>Oder eine Referenz, wie ich vorgeschlagen habe. Ich sehe halt nur keine wirklich sinnvolle Anwendung dafür, den shared_ptr per Referenz zu übergeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2379069</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2379069</guid><dc:creator><![CDATA[TNA]]></dc:creator><pubDate>Wed, 22 Jan 2014 23:03:41 GMT</pubDate></item><item><title><![CDATA[Reply to shared_ptr per Wert oder Referenz on Wed, 22 Jan 2014 23:12:01 GMT]]></title><description><![CDATA[<p>TNA schrieb:</p>
<blockquote>
<p>Ich sehe halt nur keine wirklich sinnvolle Anwendung dafür, den shared_ptr per Referenz zu übergeben.</p>
</blockquote>
<p>Eine Funktion, die <em>vielleicht</em> den shared_ptr irgendwo speichert oder vielleicht auch nicht.</p>
<p>Z.B. ein Cache, der einen shared_ptr hält, wenn der noch nicht hinzugefügt wurde und aus irgendeinem Grund kein weak_ptr verwendet werden soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2379070</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2379070</guid><dc:creator><![CDATA[gibt für alles eine App!]]></dc:creator><pubDate>Wed, 22 Jan 2014 23:12:01 GMT</pubDate></item></channel></rss>