<?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[VS8 Compileroptimierung bei Methodenaufrufen]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich werde zu dem Problem gleich noch einen Test machen, aber sicherheitshalber geht die Frage an euch raus:</p>
<p>Optimiert der Compiler von VS8 Kopieroperationen, die keinen Sinn machen? Wenn ich eine Methode aufrufe und statt einer konstanten Referenz entgegenzunehmen eine Kopie erstelle, diese aber nicht angefasst wird, macht der Compiler daraus automatisch eine Referenz?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/296316/vs8-compileroptimierung-bei-methodenaufrufen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 15 Aug 2026 01:03:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/296316.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 02 Dec 2011 08:46:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to VS8 Compileroptimierung bei Methodenaufrufen on Fri, 02 Dec 2011 08:46:26 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich werde zu dem Problem gleich noch einen Test machen, aber sicherheitshalber geht die Frage an euch raus:</p>
<p>Optimiert der Compiler von VS8 Kopieroperationen, die keinen Sinn machen? Wenn ich eine Methode aufrufe und statt einer konstanten Referenz entgegenzunehmen eine Kopie erstelle, diese aber nicht angefasst wird, macht der Compiler daraus automatisch eine Referenz?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2151793</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2151793</guid><dc:creator><![CDATA[Bonzy]]></dc:creator><pubDate>Fri, 02 Dec 2011 08:46:26 GMT</pubDate></item><item><title><![CDATA[Reply to VS8 Compileroptimierung bei Methodenaufrufen on Fri, 02 Dec 2011 09:18:05 GMT]]></title><description><![CDATA[<p>Was meinst du mit Kopie erstellen? Kopie eines Übergabeparametes? Soweit ich weiß, wird daraus keine Referenz erstellt, wenn du das nicht explizit angibst. Die Kopie wird für die Lebenszeit der Funktion behalten und danach gelöscht. Zeige am besten Beispielcode.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2151806</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2151806</guid><dc:creator><![CDATA[*Rewind*]]></dc:creator><pubDate>Fri, 02 Dec 2011 09:18:05 GMT</pubDate></item><item><title><![CDATA[Reply to VS8 Compileroptimierung bei Methodenaufrufen on Fri, 02 Dec 2011 09:20:36 GMT]]></title><description><![CDATA[<p>Davon würde ich nicht ausgehen. Nur, wenn die Methode inline wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2151809</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2151809</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 02 Dec 2011 09:20:36 GMT</pubDate></item><item><title><![CDATA[Reply to VS8 Compileroptimierung bei Methodenaufrufen on Fri, 02 Dec 2011 09:34:17 GMT]]></title><description><![CDATA[<p>[Rewind] schrieb:</p>
<blockquote>
<p>Was meinst du mit Kopie erstellen? Kopie eines Übergabeparametes?</p>
</blockquote>
<p>Es ist ja erstmal egal, wann die Kopie erstellt wird, das kann bei einem Methodenaufruf sein also als Parameter oder auch bei Beendigung der Methode also als Rückgabewert.</p>
<p>Hier mein Beispiel, damit ist gezeigt, dass es so ist:</p>
<pre><code class="language-cpp">class Test
{
    BigObject bigObject;
public:

    const BigObject&amp; GetObject() const
    {
        return bigObject;
    }
};
</code></pre>
<pre><code class="language-cpp">Test test;

    for (int i = 0; i &lt; 100000; ++i)
    {
        BigObject bigObject = test.GetObject();

        //bigObject.DoSomething(); &lt;---
    }
</code></pre>
<p>Die Methode GetObject() gibt eine konstante Referenz zurück, im Code wird allerdings eine Kopie gespeichert. Je nach dem ob die markierte Zeile auskommentiert ist oder nicht, bricht das Programm mit einem StackOverflow ab. In <strong>Release</strong> kompiliert wird also bei Nichtbenutzung des Objekts automatisch eine Referenz erzeugt und somit auch kein neuer Speicher allokiert. Also habe ich Recht behalten <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 bin zwar von mir aus drauf gekommen, aber falls es wen interessiert, hat der Thread ja doch noch seine Daseinsberechtigung.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2151817</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2151817</guid><dc:creator><![CDATA[Bonzy]]></dc:creator><pubDate>Fri, 02 Dec 2011 09:34:17 GMT</pubDate></item><item><title><![CDATA[Reply to VS8 Compileroptimierung bei Methodenaufrufen on Fri, 02 Dec 2011 09:34:47 GMT]]></title><description><![CDATA[<p>Kurzer Test mit VC9:</p>
<pre><code class="language-cpp">void test1(std::vector&lt;int&gt; v)
{
	if(v.size()==1)
		cout &lt;&lt; v[0] &lt;&lt; '\n';
}

void test2(const std::vector&lt;int&gt;&amp; v)
{
	if(v.size()==1)
		cout &lt;&lt; v[0] &lt;&lt; '\n';
}
</code></pre>
<pre><code class="language-cpp">const int size = 10000000;
std::vector&lt;int&gt; v(size);

const int count = 100;

for(int i=0;i&lt;count;++i)
    test1(v);
</code></pre>
<p>Das gleiche mit test2 und Zeitmessung:</p>
<pre><code>1575 ms
0 ms
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2151818</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2151818</guid><dc:creator><![CDATA[Hmmh]]></dc:creator><pubDate>Fri, 02 Dec 2011 09:34:47 GMT</pubDate></item><item><title><![CDATA[Reply to VS8 Compileroptimierung bei Methodenaufrufen on Fri, 02 Dec 2011 10:15:19 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12142">@Bonzy</a>: Rückgabewert und Methodenaufruf sind zwei ganz verschiedene Probleme. Rückgaben können ganz leicht optimiert werden. Da sieht der aufrufende Code, dass er die Kopie nicht braucht und spart sie sich. Ruft der Code jedoch eine Funktion auf, so kann er in der Regel nicht sehen, was in der Funktion vor sich geht und muss die Kopie machen. Und die Funktion selber kann auch nicht einfach auf Referenz umschalten, sie muss sich an ihre eigene Schnittstelle halten, sonst geht der Aufruf schief.<br />
Die einzige Möglichkeit dies zu optimieren ist also, wenn sowohl der aufrufende Code als auch der Code der Funkion gleichzeitig bekannt ist. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> Dies ist die Ausnahme! Dafür gibt es recht neue Techniken, wie man das trotzdem optimieren kann. Bei Microsoft heißt das glaube ich &quot;Link Time Optimization&quot; und muss vermutlich explizit aktiviert werden, da es doch ganz schön Compilerressourcen verbraucht und auch ein paar andere Nachteile hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2151845</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2151845</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 02 Dec 2011 10:15:19 GMT</pubDate></item><item><title><![CDATA[Reply to VS8 Compileroptimierung bei Methodenaufrufen on Fri, 02 Dec 2011 10:56:00 GMT]]></title><description><![CDATA[<p>Ich habe gerade meinen Test umgeschrieben und bin nun zu dem Schluss gekommen, dass ich doch falsch lag. Mein Test war lediglich nicht richtig aufgesetzt, mit einem Gegenbeweis lässt sich einfach leichter hantieren. <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/2151873</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2151873</guid><dc:creator><![CDATA[Bonzy]]></dc:creator><pubDate>Fri, 02 Dec 2011 10:56:00 GMT</pubDate></item></channel></rss>