<?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[C++11: ranged loop - optimization]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich sehe mir gerade ein paar Vorträge der Going Native 2013 an und hänge bei einem <a href="http://channel9.msdn.com/Events/GoingNative/2013/The-Care-and-Feeding-of-C-s-Dragons" rel="nofollow">speziellen Vortrag bei 0:41</a>:</p>
<p>Da schreibt er eine <code>for</code> Schleife in den neuen C++11 Standard Syntax um. Kann mir jemand genauer sagen, warum der neue Syntax schneller ist?</p>
<p>Der Vortragende erklärt es im Video, aber ich komme nicht mit. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Gruß,<br />
-- Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/320361/c-11-ranged-loop-optimization</link><generator>RSS for Node</generator><lastBuildDate>Sat, 18 Jul 2026 13:53:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/320361.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 25 Sep 2013 12:30:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to C++11: ranged loop - optimization on Wed, 25 Sep 2013 12:30:33 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich sehe mir gerade ein paar Vorträge der Going Native 2013 an und hänge bei einem <a href="http://channel9.msdn.com/Events/GoingNative/2013/The-Care-and-Feeding-of-C-s-Dragons" rel="nofollow">speziellen Vortrag bei 0:41</a>:</p>
<p>Da schreibt er eine <code>for</code> Schleife in den neuen C++11 Standard Syntax um. Kann mir jemand genauer sagen, warum der neue Syntax schneller ist?</p>
<p>Der Vortragende erklärt es im Video, aber ich komme nicht mit. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Gruß,<br />
-- Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2355445</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2355445</guid><dc:creator><![CDATA[Klaus82]]></dc:creator><pubDate>Wed, 25 Sep 2013 12:30:33 GMT</pubDate></item><item><title><![CDATA[Reply to C++11: ranged loop - optimization on Wed, 25 Sep 2013 13:00:43 GMT]]></title><description><![CDATA[<p>Die Version</p>
<pre><code>for( auto iter = v.begin(); iter != v.end(); ++ iter)
</code></pre>
<p>ruft in jedem Schleifendurchlauf <code>end()</code> auf. Wohingegen der Standard range-based for etwa so definiert:</p>
<pre><code>auto &amp;&amp; __range = range-init;

for ( auto __begin = begin-expr,
           __end = end-expr;
      __begin != __end;
      ++__begin )
{
	for-range-declaration = *__begin;
	statement
}
</code></pre>
<p>Hier wird also <em>end-expr</em> vor der Schleife nur einmal ausgewertet.</p>
<p>Eine weitere Begründung von ihm ist das einige Schleifenoptimierungen bei range-based for vorgenommen werden können, die der Compiler bei der obigen Variante nicht vornehmen kann, weil er nicht genügend Informationen hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2355452</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2355452</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Wed, 25 Sep 2013 13:00:43 GMT</pubDate></item><item><title><![CDATA[Reply to C++11: ranged loop - optimization on Wed, 25 Sep 2013 12:49:37 GMT]]></title><description><![CDATA[<p>Ob es schneller ist sei dahingestellt, den wenn ein Tool es aus der Schleife holen kann, dann kann es der Kompiler auch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2355454</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2355454</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Wed, 25 Sep 2013 12:49:37 GMT</pubDate></item><item><title><![CDATA[Reply to C++11: ranged loop - optimization on Wed, 25 Sep 2013 13:07:10 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>Ob es schneller ist sei dahingestellt, den wenn ein Tool es aus der Schleife holen kann, dann kann es der Kompiler auch.</p>
</blockquote>
<p>Spätestens, wenn der Compiler den Aufruf von .end() nichtmehr inlinen kann, wird ihm auch das kaum noch gelingen, denn um diese Transformation durchzuführen, muss er ja beweisen, dass .end() in jedem Durchlauf den selben Wert liefert; obige Definition einer range-based for loop dagegen, ist in jedem Fall optimal... <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/2355460</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2355460</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Wed, 25 Sep 2013 13:07:10 GMT</pubDate></item><item><title><![CDATA[Reply to C++11: ranged loop - optimization on Wed, 25 Sep 2013 17:53:17 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>Ob es schneller ist sei dahingestellt, den wenn ein Tool es aus der Schleife holen kann, dann kann es der Kompiler auch.</p>
</blockquote>
<p>Das Tool arbeitet heuristisch, ohne nachzuweisen, dass der Code in allen fällen wirklich exakt äquivalent ist. Das ist quasi &quot;nur&quot; ein sehr intelligentes &quot;Suchen und ersetzen&quot;. Dort wurde auch gesagt. das sehr gute Compiler in einigen Fällen die selben Optimierungen machen können aber nicht in allen. Natürlich gibt es alleine wegen der besseren Übersichtlichkeit genug Grund die neue Syntax zu verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2355546</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2355546</guid><dc:creator><![CDATA[TNA]]></dc:creator><pubDate>Wed, 25 Sep 2013 17:53:17 GMT</pubDate></item><item><title><![CDATA[Reply to C++11: ranged loop - optimization on Wed, 25 Sep 2013 17:55:19 GMT]]></title><description><![CDATA[<p>dot schrieb:</p>
<blockquote>
<p>knivil schrieb:</p>
<blockquote>
<p>Ob es schneller ist sei dahingestellt, den wenn ein Tool es aus der Schleife holen kann, dann kann es der Kompiler auch.</p>
</blockquote>
<p>Spätestens, wenn der Compiler den Aufruf von .end() nichtmehr inlinen kann, wird ihm auch das kaum noch gelingen, denn um diese Transformation durchzuführen, muss er ja beweisen, dass .end() in jedem Durchlauf den selben Wert liefert; obige Definition einer range-based for loop dagegen, ist in jedem Fall optimal... <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>Jeder vernünftige Compiler bekommt das hin.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2355547</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2355547</guid><dc:creator><![CDATA[lto]]></dc:creator><pubDate>Wed, 25 Sep 2013 17:55:19 GMT</pubDate></item><item><title><![CDATA[Reply to C++11: ranged loop - optimization on Wed, 25 Sep 2013 17:59:08 GMT]]></title><description><![CDATA[<p>Außer end() befindet sich in einer dynamisch gelinkten Bibliothek.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2355549</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2355549</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Wed, 25 Sep 2013 17:59:08 GMT</pubDate></item><item><title><![CDATA[Reply to C++11: ranged loop - optimization on Wed, 25 Sep 2013 18:02:40 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<p>Außer end() befindet sich in einer dynamisch gelinkten Bibliothek.</p>
</blockquote>
<p>Was hier aber unmöglich ist, weil alle Container Templates sind.</p>
<p>Es können sich aber einige von <code>end()</code> aufgerufene Funktionen in einer DLL befinden, das wäre dann der Fall. Das ist aber recht selten - das finde ich bspw. beim GCC nicht. Und daher gilt das Argument nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2355550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2355550</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Wed, 25 Sep 2013 18:02:40 GMT</pubDate></item><item><title><![CDATA[Reply to C++11: ranged loop - optimization on Wed, 25 Sep 2013 18:17:00 GMT]]></title><description><![CDATA[<p>lto schrieb:</p>
<blockquote>
<p>Jeder vernünftige Compiler bekommt das hin.</p>
</blockquote>
<p>und du meinst Chandler Carruth erzählt aus irgendwelchen Markeding Gründen oder weil er es nicht besser weiss irdenwas?</p>
<p>ich mein der Typ is auf compiler optimizer spezialisier, der sollte es doch eigentlich wissen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2355554</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2355554</guid><dc:creator><![CDATA[kurze_frage]]></dc:creator><pubDate>Wed, 25 Sep 2013 18:17:00 GMT</pubDate></item><item><title><![CDATA[Reply to C++11: ranged loop - optimization on Wed, 25 Sep 2013 19:55:24 GMT]]></title><description><![CDATA[<p>Siehe auch: <a href="http://stackoverflow.com/questions/10821756/is-the-ranged-based-for-loop-beneficial-to-performance" rel="nofollow">Is the range based for loop beneficial to performance?</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2355575</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2355575</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 25 Sep 2013 19:55:24 GMT</pubDate></item><item><title><![CDATA[Reply to C++11: ranged loop - optimization on Wed, 25 Sep 2013 20:20:05 GMT]]></title><description><![CDATA[<p>Eigentlich sollte aber end(), gerade wenn es nur ein Getter auf eine interne Membervariable ist, geinlined werden.</p>
<p>Und ob man dann auf den internen, privat gespeicherten end-Iterator in vector zugreift, oder auf seinen eigenen lokalen, ist letztendlich egal.</p>
<p>Edit: Für den GCC, Nun gut, da ist es nicht sofort ein Iterator, aber er erzeugt einen Iterator durch einen Zeiger.</p>
<pre><code>iterator
      end() _GLIBCXX_NOEXCEPT
      { return iterator(this-&gt;_M_impl._M_finish); }
</code></pre>
<p>Wobei <code>_M_finish</code> ein Zeiger ist..</p>
<p>Kann wahrscheinlich optimiert werden, weil die Kopie des Zeigers zum internen Zeiger von <code>__normal_iterator</code> dem Compiler eigentlich als überflüssig erscheinen sollte.</p>
<p>Aber da würde ich nicht meine Hand ins Feuer halten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2355577</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2355577</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Wed, 25 Sep 2013 20:20:05 GMT</pubDate></item><item><title><![CDATA[Reply to C++11: ranged loop - optimization on Wed, 25 Sep 2013 21:17:20 GMT]]></title><description><![CDATA[<p>lto schrieb:</p>
<blockquote>
<p>dot schrieb:</p>
<blockquote>
<p>knivil schrieb:</p>
<blockquote>
<p>Ob es schneller ist sei dahingestellt, den wenn ein Tool es aus der Schleife holen kann, dann kann es der Kompiler auch.</p>
</blockquote>
<p>Spätestens, wenn der Compiler den Aufruf von .end() nichtmehr inlinen kann, wird ihm auch das kaum noch gelingen, denn um diese Transformation durchzuführen, muss er ja beweisen, dass .end() in jedem Durchlauf den selben Wert liefert; obige Definition einer range-based for loop dagegen, ist in jedem Fall optimal... <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>Jeder vernünftige Compiler bekommt das hin.</p>
</blockquote>
<p>Wenn du es mit STL Containern zu tun hast, dann in der Regel wohl ja, aber im Allgemeinen gibt es eben Fälle, wo selbst der vernünftigste aller Compiler das rein prinzipiell nicht hinbekommen kann. Natürlich kann man immer per Hand seine Schleife optimieren...</p>
<p>Ich seh jedenfalls keinen Grund dazu, range-based for loops zu meiden. Ich kann damit kürzeren, ausdrucksstärkeren, besser lesbaren Code schreiben und bekomme im schlechtesten Fall gleich guten Maschinencode als mit einer funktional äquivalenten aber komplizierteren, normalen for loop...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2355578</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2355578</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Wed, 25 Sep 2013 21:17:20 GMT</pubDate></item><item><title><![CDATA[Reply to C++11: ranged loop - optimization on Wed, 25 Sep 2013 21:11:25 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Und ob man dann auf den internen, privat gespeicherten end-Iterator in vector zugreift, oder auf seinen eigenen lokalen, ist letztendlich egal.</p>
</blockquote>
<p>Nein, denn bei einem <code>end()</code> -Aufruf ist es massiv schwieriger zu beweisen, dass sich der Wert zwischen den Iterationen nicht ändert, als bei einer lokalen Variable.</p>
<p>Der Scope der Membervariable ist viel grösser und vom Scope des Containers abhängig. Bei selbstgeschriebenen Containern sind ausserdem Multithreaded-Zugriffe, pro Aufruf neu berechnete <code>end()</code> -Iteratoren und tief verschachtelte Funktionen nicht auszuschliessen (bei der STL auch nicht, aber da kann der Compiler a priori Annahmen treffen). Insofern wundert es mich nicht, dass hier mit Range-Based For durchaus optimiert werden kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2355590</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2355590</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 25 Sep 2013 21:11:25 GMT</pubDate></item><item><title><![CDATA[Reply to C++11: ranged loop - optimization on Tue, 01 Oct 2013 14:09:34 GMT]]></title><description><![CDATA[<p>Puh,<br />
da hatte ich etwas losgetreten. Auf jeden Fall danke für die Antworten, auch wenn mir viele wieder viel zu hoch sind.</p>
<p>Ich denke ich bleibe bei der Aussage: Wenn ein Programm das schafft, dann kann das der Compiler auch.</p>
<p>Auf jeden Fall sollte ich mir den Compiler und das nette Feature alles einzurücken genauer anschauen, ich bin beim Quellcode auch so ein Layout-Perfektionist. <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>
<p>Gruß,<br />
-- Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2357078</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2357078</guid><dc:creator><![CDATA[Klaus82]]></dc:creator><pubDate>Tue, 01 Oct 2013 14:09:34 GMT</pubDate></item></channel></rss>