<?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[Vorteile von unterschiedlichen for-Schleifen: for(int a : vec), BOOST_FOREACH(a,vec), for(auto a=vec.begin();a!=vec.end(]]></title><description><![CDATA[<p>Hallo,</p>
<p>gibt es irgendeinen Vorteil von:</p>
<pre><code>for(int a : vec)
{

}
</code></pre>
<p>gegenueber:</p>
<pre><code>for(auto a=vec.cbegin();a!=vec.cend();a++)
{
}
</code></pre>
<p>Die erste Schleife ist weniger Schreibarbeit fuer mich, aber gibt es einen unterschied fuer den Compiler?</p>
<p><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>
]]></description><link>https://www.c-plusplus.net/forum/topic/321210/vorteile-von-unterschiedlichen-for-schleifen-for-int-a-vec-boost_foreach-a-vec-for-auto-a-vec-begin-a-vec-end</link><generator>RSS for Node</generator><lastBuildDate>Wed, 22 Jul 2026 00:02:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/321210.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 28 Oct 2013 05:25:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vorteile von unterschiedlichen for-Schleifen: for(int a : vec), BOOST_FOREACH(a,vec), for(auto a=vec.begin();a!=vec.end( on Mon, 28 Oct 2013 05:25:08 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>gibt es irgendeinen Vorteil von:</p>
<pre><code>for(int a : vec)
{

}
</code></pre>
<p>gegenueber:</p>
<pre><code>for(auto a=vec.cbegin();a!=vec.cend();a++)
{
}
</code></pre>
<p>Die erste Schleife ist weniger Schreibarbeit fuer mich, aber gibt es einen unterschied fuer den Compiler?</p>
<p><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>
]]></description><link>https://www.c-plusplus.net/forum/post/2363391</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363391</guid><dc:creator><![CDATA[ForWas]]></dc:creator><pubDate>Mon, 28 Oct 2013 05:25:08 GMT</pubDate></item><item><title><![CDATA[Reply to Vorteile von unterschiedlichen for-Schleifen: for(int a : vec), BOOST_FOREACH(a,vec), for(auto a=vec.begin();a!=vec.end( on Mon, 28 Oct 2013 05:31:12 GMT]]></title><description><![CDATA[<p>Ja, die erste Schleife kann optimierr sein.<br />
Nd sie ist auf jeden Fall besser als deine, die in jedem Durchlauf cend() aufruft.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363396</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363396</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Mon, 28 Oct 2013 05:31:12 GMT</pubDate></item><item><title><![CDATA[Reply to Vorteile von unterschiedlichen for-Schleifen: for(int a : vec), BOOST_FOREACH(a,vec), for(auto a=vec.begin();a!=vec.end( on Mon, 28 Oct 2013 13:35:36 GMT]]></title><description><![CDATA[<p>In der Praxis gibt es wohl nur selten einen Unterschied, da der end()-Aufruf geinlined werden kann.<br />
Dennoch ist range based for einfacher zu schreiben, einfacher zu lesen und somit auch einfacher zu warten.<br />
BOOST_FOREACH ist fuer Compiler, die kein range based for koennen.<br />
std::for_each ist manchmal auch eine gute Loesung.<br />
Rohe for-schleifen Schleifen braucht man verhaeltnismaesig selten und sollte die anderen bevorzugen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363508</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363508</guid><dc:creator><![CDATA[Marthog]]></dc:creator><pubDate>Mon, 28 Oct 2013 13:35:36 GMT</pubDate></item><item><title><![CDATA[Reply to Vorteile von unterschiedlichen for-Schleifen: for(int a : vec), BOOST_FOREACH(a,vec), for(auto a=vec.begin();a!=vec.end( on Mon, 28 Oct 2013 21:51:56 GMT]]></title><description><![CDATA[<p>Marthog schrieb:</p>
<blockquote>
<p>In der Praxis gibt es wohl nur selten einen Unterschied, da der end()-Aufruf geinlined werden kann.</p>
</blockquote>
<p>Also im Going Native 2013 Beitrag wo über Range-Based-For gesprochen wurde, wurde behauptet dass es in der Praxis eben doch einen Unterschied macht. Weil die end() Aufrufe eben oft nicht aus der Schleife rausgezogen werden können.</p>
<p>(Inlining geht wohl meistens, ja. Ohne dass der Compiler erkennt dass das Ergebnis von end() Konstant ist, und die Berechnung aus der Schleife rauszieht, wird die &quot;manuelle&quot; Schleife aber trotzdem langsamer sein.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363603</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363603</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 28 Oct 2013 21:51:56 GMT</pubDate></item><item><title><![CDATA[Reply to Vorteile von unterschiedlichen for-Schleifen: for(int a : vec), BOOST_FOREACH(a,vec), for(auto a=vec.begin();a!=vec.end( on Mon, 28 Oct 2013 22:03:17 GMT]]></title><description><![CDATA[<p>Für die Diskussion zur Performance von Range Based For siehe <a href="http://www.c-plusplus.net/forum/320361-full" rel="nofollow">hier</a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363607</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363607</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 28 Oct 2013 22:03:17 GMT</pubDate></item><item><title><![CDATA[Reply to Vorteile von unterschiedlichen for-Schleifen: for(int a : vec), BOOST_FOREACH(a,vec), for(auto a=vec.begin();a!=vec.end( on Tue, 29 Oct 2013 01:53:41 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Marthog schrieb:</p>
<blockquote>
<p>In der Praxis gibt es wohl nur selten einen Unterschied, da der end()-Aufruf geinlined werden kann.</p>
</blockquote>
<p>Also im Going Native 2013 Beitrag wo über Range-Based-For gesprochen wurde, wurde behauptet dass es in der Praxis eben doch einen Unterschied macht. Weil die end() Aufrufe eben oft nicht aus der Schleife rausgezogen werden können.</p>
<p>(Inlining geht wohl meistens, ja. Ohne dass der Compiler erkennt dass das Ergebnis von end() Konstant ist, und die Berechnung aus der Schleife rauszieht, wird die &quot;manuelle&quot; Schleife aber trotzdem langsamer sein.)</p>
</blockquote>
<p>Wenn das so ist, dann geh da nicht mehr hin, würde ich sagen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363617</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363617</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 29 Oct 2013 01:53:41 GMT</pubDate></item><item><title><![CDATA[Reply to Vorteile von unterschiedlichen for-Schleifen: for(int a : vec), BOOST_FOREACH(a,vec), for(auto a=vec.begin();a!=vec.end( on Tue, 29 Oct 2013 02:13:18 GMT]]></title><description><![CDATA[<p>Weiß nicht, das wurde von den Typen behauptet die die Compiler schreiben, man sollte meinen die wissen sowas.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363618</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363618</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 29 Oct 2013 02:13:18 GMT</pubDate></item><item><title><![CDATA[Reply to Vorteile von unterschiedlichen for-Schleifen: for(int a : vec), BOOST_FOREACH(a,vec), for(auto a=vec.begin();a!=vec.end( on Tue, 29 Oct 2013 03:01:13 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/106">@volkard</a><br />
Wo hin?<br />
Ich hab mir den Beitrag online angesehen.</p>
<p>Davon abgesehen weiss ich selbst dass es Fälle gibt wo der Compiler nicht erkennen kann dass bei <code>end()</code> immer das selbe rauskommt. Wenn ich deinen Beitrag richtig deute, also wenn du behaupten willst dass die &quot;kann nicht optimiert werden&quot; Behauptung Blödsinn ist, dann muss ich da ganz klar widersprechen.</p>
<p>Beispiel:</p>
<pre><code class="language-cpp">void Foo::Bar()
{
    std::vector&lt;Baz&gt; batzen;
    for (auto it = m_baz.begin(); it != m_baz.end(); ++it)
        if (very_selective_condition(*it))
            batzen.push_back(*it);
}
</code></pre>
<p>Ein Compiler kann hier nur sinnvoll optimieren, wenn er beweisen kann dass <code>m_baz</code> nicht über den &quot; <code>new</code> Handler&quot; ( <code>_set_new_handler()</code> ) modifiziert werden kann. Und das wird i.A. ziemlich schwer zu beweisen sein.<br />
Dazu müsste er entweder beweisen dass die Adresse des Foo-Objekts mit dem gearbeitet wird nur lokal bekannt ist, oder dass im ganzen Programm kein <code>new</code> Handler gesetzt wird. Oder dass alle <code>new</code> Handler &quot;brav&quot; sind.</p>
<p>Die erste Option (Adresse des Objekts nur lokal Bekannt) halte ich dabei noch für halbwegs realistisch. Die fällt aber auch flach sobald <code>Foo::Bar</code> nicht selbst inline erweitert wird, und das wird durchaus kein seltener Fall sein. Wenn man DLLs verwendet hat man den sogar andauernd.<br />
Die anderen Varianten halte ich für völlig utopisch.</p>
<p>(OK, theoretisch wäre noch möglich dass der Compiler Code erzeugt der <code>m_baz.end()</code> nur neu berechnet wenn mal <code>push_back</code> aufgerufen wurden. Das halte ich aber auch für reichlich weit hergeholt.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363620</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363620</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 29 Oct 2013 03:01:13 GMT</pubDate></item><item><title><![CDATA[Reply to Vorteile von unterschiedlichen for-Schleifen: for(int a : vec), BOOST_FOREACH(a,vec), for(auto a=vec.begin();a!=vec.end( on Tue, 29 Oct 2013 04:18:52 GMT]]></title><description><![CDATA[<p>Ich meinte eher im Sinne von &quot;Zeitverschwendung, zugehört zu haben&quot;, vor allem wegen</p>
<p>a) Wer bei</p>
<pre><code>for(auto a=vec.cbegin();a!=vec.cend();a++)
</code></pre>
<p>unsicher ist, schreibt schon lange</p>
<pre><code>for(auto a=vec.cbegin(),e=vec.cend();a!=e;++a)
</code></pre>
<p>und auch ein wenig wegen</p>
<p>b) Man kann meistens wohl erwarten, daß end() inline ist und höchstens einen Attribut-Zugriff macht, und das im Cache liegt, ich sehe keinen Bedarf, hier Performanceerwägungen ins Feld zu führen. So, wie ich oft kein lokales e aushebe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363621</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363621</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 29 Oct 2013 04:18:52 GMT</pubDate></item><item><title><![CDATA[Reply to Vorteile von unterschiedlichen for-Schleifen: for(int a : vec), BOOST_FOREACH(a,vec), for(auto a=vec.begin();a!=vec.end( on Tue, 29 Oct 2013 09:10:38 GMT]]></title><description><![CDATA[<p>ForWas schrieb:</p>
<blockquote>
<p>gibt es irgendeinen Vorteil von:</p>
<pre><code>for(int a : vec)
{

}
</code></pre>
<p>gegenueber:</p>
<pre><code>for(auto a=vec.cbegin();a!=vec.cend();a++)
{
}
</code></pre>
<p>?</p>
</blockquote>
<p>Nimm einfach das, von dem du glaubst, dass das für andere sehr gut lesbar wird. Bei dem längeren <code>for</code> kann ein Leser nicht auf einen Blick erkennen, was da passiert. Er muss alle drei Teile überprüfen. Und dann kommt raus, dass es doch nur ein Loop über alle Elemente ist (sofern da kein <code>break</code> drin steht). Deswegen fand ich std::for_each auch nicht so schlecht von der Idee her. Da steht ja schon im Namen drin, wie und worüber iteriert werden soll. Nur ist das mit dem Iterator-Paar, was anzugeben ist, etwas lästig und ohne polymorphe Lambdas muss man da auch schon wieder zu viel schreiben.</p>
<p>Manches an Schreibarbeit kann man sich aber mit'nem fähigen Editor sparen. Zum Beispiel bietet ein sehr einfacher Editor (gedit für *nix) ein &quot;Snippets&quot;-Feature an, mit dem man sich Tipparbeit sparen kann. Das Ding ist mit Python script-bar. So generiere ich auch inzwischen Include-Guards (einfach ein paar Bytes von /dev/random nehmen und die auf INCLUDE_GUARD_XXXXXXXXXXXXXXXXXXXXXXXXXX mappen, wobei X jeweils ein zufälliges Zeichen aus [A-Z,0-9] ist. In der Hinsicht unterscheiden sich deine zwei Varianten nicht besonders. Mit entsprechender Editor-Konfiguration lässt sich beides ähnlich schnell tippen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363644</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363644</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 29 Oct 2013 09:10:38 GMT</pubDate></item><item><title><![CDATA[Reply to Vorteile von unterschiedlichen for-Schleifen: for(int a : vec), BOOST_FOREACH(a,vec), for(auto a=vec.begin();a!=vec.end( on Tue, 29 Oct 2013 11:24:19 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Ich meinte eher im Sinne von &quot;Zeitverschwendung, zugehört zu haben&quot;</p>
</blockquote>
<p>War es ganz sicher nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363668</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363668</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 29 Oct 2013 11:24:19 GMT</pubDate></item></channel></rss>