<?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[Copy-Ctor optimierung]]></title><description><![CDATA[<p>Hallo allerseits!</p>
<p>Hat jemand von euch getestet ob z.B. vektor.push_back(objekt) in vektor.push_back(&amp;objekt) von modernen compilern optimiert werden kann, wenn z.B. nur der default Copy-Ctor verwendet wird?</p>
<p>Danke für die Information!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/199678/copy-ctor-optimierung</link><generator>RSS for Node</generator><lastBuildDate>Sat, 03 Oct 2026 19:18:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/199678.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 05 Dec 2007 23:03:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Copy-Ctor optimierung on Wed, 05 Dec 2007 23:03:07 GMT]]></title><description><![CDATA[<p>Hallo allerseits!</p>
<p>Hat jemand von euch getestet ob z.B. vektor.push_back(objekt) in vektor.push_back(&amp;objekt) von modernen compilern optimiert werden kann, wenn z.B. nur der default Copy-Ctor verwendet wird?</p>
<p>Danke für die Information!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1415556</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1415556</guid><dc:creator><![CDATA[alteKartoffel]]></dc:creator><pubDate>Wed, 05 Dec 2007 23:03:07 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Ctor optimierung on Thu, 06 Dec 2007 02:55:35 GMT]]></title><description><![CDATA[<p>Hallo alteKartoffel,</p>
<p>Die Signatur der Methode heißt:</p>
<pre><code class="language-cpp">void push_back( const T&amp; obj );
</code></pre>
<p>Folglich wird als Übergabeparameter noch keine Kopie erstellt.</p>
<p>Natürlich kann der Compiler als Eintrag nicht einfach einen Zeiger<br />
von dem Objekt speichern, da es sich auf dem Stack befinden könnte<br />
oder gelöscht werden könnte bevor es nicht mehr im Vector gebraucht<br />
wird.<br />
Folglich kommt der Compiler an dieser Stelle nicht an einem Copy-Construktor-Aufruf vorbei. (Jedenfalls wüsste ich nicht wie und halte es für ausgeschlossen)<br />
Ob jetzt explizit ein Konstruktor definiert wurde, macht an dieser Stelle ja<br />
keinen Unterschied, da du ja keine Garantie für die Lebensdauer des Objektes<br />
hast.</p>
<p>Gruß,<br />
CSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1415578</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1415578</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 06 Dec 2007 02:55:35 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Ctor optimierung on Thu, 06 Dec 2007 10:30:39 GMT]]></title><description><![CDATA[<p>Bei der Uebergabe an push_back gibts keine Kopie, wie CStoll schon sagt. in push_back selber wird aber auf jeden Fall eine Kopie erzeugt, da das Objekt, wo auch immer das Original war, ja in den vom vector&lt;&gt; verwalteten Speicher kopiert werden muss, vermutlich per placement-new und copy-Ctor. Nehmen wir mal an, es wuerde in rigendeiner Implementation keine Kopie gemacht (was schon wegen dem Speichermodell von vwector&lt;&gt; nicht moeglich ist), dann zeigft folgendes beispiel wie grausam das waere:</p>
<pre><code class="language-cpp">class A {/*...*/};

int main() 
{
  std::vector&lt;A&gt; avec;
  for (int i = 0; i &lt; 10; ++i) {
    A atmp;
    avec.push_back(atmp);
  } //hier wird atmp zerstoert!
  // 1)
}
</code></pre>
<p>Da im vector keine Kopien von atmp abgelegt wurden, beinhaltet der vector jetzt 10 Leichen (kaputte Referenzen, Pointer ins Nirvana oder was auch immer)<br />
Fazit: eine Kopie gibts immer und muss es immer geben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1415718</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1415718</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 06 Dec 2007 10:30:39 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Ctor optimierung on Thu, 06 Dec 2007 11:17:17 GMT]]></title><description><![CDATA[<p>Ich meine natürlich am Beispiel ob ein Compiler das intern erledigen könnte und alle entsprechenden Abhängigkeiten handhabt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1415741</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1415741</guid><dc:creator><![CDATA[alteKartoffel]]></dc:creator><pubDate>Thu, 06 Dec 2007 11:17:17 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Ctor optimierung on Thu, 06 Dec 2007 11:27:40 GMT]]></title><description><![CDATA[<p>Default-Copy-Ctor = elementweises Kopieren. Sprich, fuer jedes Element wird wiederum dessen Copy-Cotr aufgerufen. Wenn deine Klasse (bwz. deren Unterklassen) nur aus PODs bestehen, dann bedeutet der Default-Copy-Ctor also das stumpfe Kopieren von PODs von einem speicher in den anderen. besonders viel zu optimieren gibts da nicht.<br />
Was du mit den &quot;entsprechenden Abhaengigkeiten&quot; meinst und was fuer dich beim Compiler &quot;intern&quot; bedeutet (was waere denn extern?), kann ich nicht ganz nachvollziehn.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1415748</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1415748</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 06 Dec 2007 11:27:40 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Ctor optimierung on Thu, 06 Dec 2007 12:17:47 GMT]]></title><description><![CDATA[<p>ich meine z.B.:</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
#include ...

static std::vector&lt;meinTyp&gt; vektor;

void ErstelleDaten()
{
  for(int i=0; i&lt;2000; i++)
  {
     vektor.push_back(meinTyp(i));
  }
}
...
</code></pre>
<p>oder z.B.:</p>
<pre><code class="language-cpp">// x.cpp
#include &lt;vector&gt;
#include ...

static std::vector&lt;meinTyp&gt; vektor;

void AddElement(meinTyp&amp; element)
{
  vektor.push_back(element);
}
...

// y.cpp
#include ...

void MacheWas()
{
  meinTyp elemente[30];

  for(int i=0; i&lt;30; i++)
  {
     ...
     AddElement(elemente[i]);
  }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1415781</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1415781</guid><dc:creator><![CDATA[alteKartoffel]]></dc:creator><pubDate>Thu, 06 Dec 2007 12:17:47 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Ctor optimierung on Thu, 06 Dec 2007 12:29:03 GMT]]></title><description><![CDATA[<p>Bei Beispiel 1 wird ein temporaeres Element auf dem Stack angelegt und an push_back uebergeben, was im Endeffekt dazu fuehrt, dass der vector eine Kopie auf dem free store oder heap anlegt in dem von ihm verwalteten Speicher. Ob der Compiler das wegoptimieren kann und gleich ein meinTyp(i) auf dem free store draus macht, weiss ich nicht, gehe ich aber nicht von aus.</p>
<p>Beispiel 2 ist nicht grossartig zu optimieren. in AddElement() ist &quot;element&quot; nur eine Referenz auf elemente[i], und das uebergibst du wiederum an die Referenz in push_back(). Am Ende wird push_back() diese Referenz auf elemente[i] an den Copy-Ctor uebergeben, weshalb das Objekt im free store direkt con elemente[i] kopiert wird, ohne wegoptimierbare Zwischeninstanzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1415790</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1415790</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 06 Dec 2007 12:29:03 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Ctor optimierung on Thu, 06 Dec 2007 13:23:11 GMT]]></title><description><![CDATA[<p>Cool...</p>
<p>Man hält mich schon für so kompetent wie CStoll ^^</p>
<p>Wie gesagt:<br />
Der Compiler analysiert mit Sicherheit nicht, ob die Lebenszeit des Objektes<br />
größer ist als die Aufbewahrung im Vektor.<br />
Dazu müsste er ja die komplette Programmlogik analysieren. -&gt; Utopisch</p>
<p>Im 1. Beispiel ist das Objekt zwar (mit ziemlicher Sicherheit außer static) auf dem Stack, muss aber beim nächsten Vektor-Aufruf nicht mehr vorhanden sein.</p>
<p>Zu Beispiel 2:<br />
Nach Verlassen von MacheWas ist dein Objekt ja schon zerstört und folglich<br />
hättest du nen Dangling Pointer (Zeiger auf einen freigegebenen Speicherbereich)</p>
<p>Gruß,<br />
CSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1415839</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1415839</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 06 Dec 2007 13:23:11 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Ctor optimierung on Thu, 06 Dec 2007 14:49:15 GMT]]></title><description><![CDATA[<p>CSpille schrieb:</p>
<blockquote>
<p>Man hält mich schon für so kompetent wie CStoll ^^</p>
</blockquote>
<p>Nein, man liest nur einen Namen der mit CS anfaengt und kriegt aus dem Augenwinkel noch die ll mit =&gt; alles klar, das muss CStoll sein <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="😉"
    /> Hab draus gelernt und werd demnaechst genauer hinschaun <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/1415915</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1415915</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 06 Dec 2007 14:49:15 GMT</pubDate></item></channel></rss>