<?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[Variable in Schleife anlegen langsam?]]></title><description><![CDATA[<p>Abend,</p>
<p>eine kurze Frage:<br />
wenn ich eine Variable in einer Schleife anlege wie hier:</p>
<pre><code class="language-cpp">for(int i=0; i &lt; k; i++) {
   float foo = a[i] + ...;
   // benutze foo
}
</code></pre>
<p>ist das dann langsamer als wenn ich die Definition aus dem Rumpf ziehe:</p>
<pre><code class="language-cpp">float foo;
for(int i=0; i &lt; k; i++) {
   foo = a[i] + ...;
   // benutze foo
}
</code></pre>
<p>??</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/243349/variable-in-schleife-anlegen-langsam</link><generator>RSS for Node</generator><lastBuildDate>Sun, 20 Sep 2026 03:27:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/243349.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 15 Jun 2009 19:35:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Variable in Schleife anlegen langsam? on Mon, 15 Jun 2009 19:35:59 GMT]]></title><description><![CDATA[<p>Abend,</p>
<p>eine kurze Frage:<br />
wenn ich eine Variable in einer Schleife anlege wie hier:</p>
<pre><code class="language-cpp">for(int i=0; i &lt; k; i++) {
   float foo = a[i] + ...;
   // benutze foo
}
</code></pre>
<p>ist das dann langsamer als wenn ich die Definition aus dem Rumpf ziehe:</p>
<pre><code class="language-cpp">float foo;
for(int i=0; i &lt; k; i++) {
   foo = a[i] + ...;
   // benutze foo
}
</code></pre>
<p>??</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1727199</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1727199</guid><dc:creator><![CDATA[U21Schauer]]></dc:creator><pubDate>Mon, 15 Jun 2009 19:35:59 GMT</pubDate></item><item><title><![CDATA[Reply to Variable in Schleife anlegen langsam? on Mon, 15 Jun 2009 20:04:16 GMT]]></title><description><![CDATA[<p>Bei einem eigebauten Typ wie float &quot;sollte&quot; das keinen Unterschied machen, erst recht nicht, wenn dein Compiler zumindest ein bisschen optimiert. Bei einer Klasse mit komplexen Kostruktor/Destruktor kann es einen Unterschied machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1727212</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1727212</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 15 Jun 2009 20:04:16 GMT</pubDate></item><item><title><![CDATA[Reply to Variable in Schleife anlegen langsam? on Tue, 16 Jun 2009 05:45:33 GMT]]></title><description><![CDATA[<p>Du kannst ja einfach mal die Zeit messen (über sehr viele Iterationen natürlich). Ich bin sicher, dass du zumindest bei eingeschalteten Compiler-Optimierungen keinen Unterschied feststellst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1727333</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1727333</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Tue, 16 Jun 2009 05:45:33 GMT</pubDate></item><item><title><![CDATA[Reply to Variable in Schleife anlegen langsam? on Tue, 16 Jun 2009 06:21:12 GMT]]></title><description><![CDATA[<p>Es macht definitiv keinen Unterschied. Da wird ja kein Code ausgeführt. Es wird noch nicht mal Speicher alloziiert, da lokale Variablen auf dem Stack liegen.</p>
<p>Anders sieht die Sache aus, wenn der Typ einen Konstruktor hat. Der wird dann natürlich ausgeführt. Aber auch da kommt es darauf an, ob der Konstruktor überhaupt was substantielles macht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1727343</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1727343</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Tue, 16 Jun 2009 06:21:12 GMT</pubDate></item><item><title><![CDATA[Reply to Variable in Schleife anlegen langsam? on Tue, 16 Jun 2009 06:40:28 GMT]]></title><description><![CDATA[<p>Und wie das nen Unterschied macht es nen Unterschied, da erst ein Konstruktor und dann ein Zuweisungsoperator aufgerufen wird:<br />
Z.B.:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class Test
{
    public:
        Test( int val=13 )
         : m_val(val)
        {
            std::cout &lt;&lt; &quot;Konstruktor mit &quot; &lt;&lt; m_val &lt;&lt; std::endl;
        }
        Test( const Test&amp; other )
        {
            if( &amp;other != this ) {
                m_val = other.m_val;
                std::cout &lt;&lt; &quot;Kopierkonstruktor mit &quot; &lt;&lt; m_val &lt;&lt; std::endl;
            }
        }
        const Test&amp; operator=( const Test&amp; other )
        {
            if( &amp;other != this ) {
                m_val = other.m_val;
                std::cout &lt;&lt; &quot;Zuweisungsoperator mit &quot; &lt;&lt; m_val &lt;&lt; std::endl;
            }
            return *this;
        }
    private:
        int m_val;
};

int main()
{
    std::cout &lt;&lt; &quot;Variable außerhalb von Schleife&quot; &lt;&lt; std::endl;
    Test t;
    for( int i=0; i&lt;10; i++ ) {
        t = i;
    }

    std::cout &lt;&lt; std::endl &lt;&lt; &quot;Variable innerhalb von Schleife&quot; &lt;&lt; std::endl;
    for( int i=0; i&lt;10; i++ ) {
        Test t2(i);
    }
    return 0;
}
</code></pre>
<p>Ausgabe:</p>
<pre><code>Variable außerhalb von Schleife
Konstruktor mit 13             
Konstruktor mit 0              
Zuweisungsoperator mit 0       
Konstruktor mit 1              
Zuweisungsoperator mit 1       
Konstruktor mit 2              
Zuweisungsoperator mit 2       
Konstruktor mit 3              
Zuweisungsoperator mit 3       
Konstruktor mit 4              
Zuweisungsoperator mit 4       
Konstruktor mit 5              
Zuweisungsoperator mit 5       
Konstruktor mit 6              
Zuweisungsoperator mit 6       
Konstruktor mit 7              
Zuweisungsoperator mit 7       
Konstruktor mit 8              
Zuweisungsoperator mit 8       
Konstruktor mit 9              
Zuweisungsoperator mit 9

Variable innerhalb von Schleife
Konstruktor mit 0
Konstruktor mit 1
Konstruktor mit 2
Konstruktor mit 3
Konstruktor mit 4
Konstruktor mit 5
Konstruktor mit 6
Konstruktor mit 7
Konstruktor mit 8
Konstruktor mit 9
</code></pre>
<p>Und auch &quot;nichtige&quot; Zuweisungen an Member sind Operationen, die bei großen Datenmengen ins Gewicht fallen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1727352</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1727352</guid><dc:creator><![CDATA[Knolle123]]></dc:creator><pubDate>Tue, 16 Jun 2009 06:40:28 GMT</pubDate></item><item><title><![CDATA[Reply to Variable in Schleife anlegen langsam? on Tue, 16 Jun 2009 07:19:44 GMT]]></title><description><![CDATA[<p>@Knolle123: Wo hast du dein float versteckt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1727364</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1727364</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 16 Jun 2009 07:19:44 GMT</pubDate></item><item><title><![CDATA[Reply to Variable in Schleife anlegen langsam? on Tue, 16 Jun 2009 07:44:28 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>@Knolle123: Wo hast du dein float versteckt?</p>
</blockquote>
<p>Sry, dass ich das &quot;float&quot; unterschlagen hab und durch ein int ersetzt hab.<br />
Aber das Beispiel war eher auf die Verwendung von Klassen gerichtet. Und sobald ich Klassen verwende, habe ich auch Daten zu kapseln, die dann beim Zuweisungsoperator/Kopierkonstruktor mit zugewiesen werden müssen. Und wenn dies 2n + 1 mal geschieht (Deklaration + (Konstruktor+Zuweisungsoperator)*n) fällt das schon irgendwann ins Gewicht.</p>
<p>Und dem Ausgangspost konnte ich nicht entnehmen, dass es sich nur um eine Frage bezügl. &quot;float&quot; dreht, sondern allgemein um &quot;Variablendefinition in oder außerhalb Schleife&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1727381</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1727381</guid><dc:creator><![CDATA[Knolle123]]></dc:creator><pubDate>Tue, 16 Jun 2009 07:44:28 GMT</pubDate></item><item><title><![CDATA[Reply to Variable in Schleife anlegen langsam? on Tue, 16 Jun 2009 09:51:31 GMT]]></title><description><![CDATA[<p>@Knolle123,<br />
Auch noch zwei andere Dinge hast du hier falsch gemacht. Du hast hier nicht Objekte gleichen Typs einander zugewiesen, sondern von unterschiedlichen Typen. Dadurch wird natürlich ein <code>cast</code> fällig. Auch hast du den Destruktor vergessen.<br />
Nimmst du allerdings diese Besonderheiten heraus, dann hast du das folgende:<br />
<strong>Variable ausserhalb der Schleife</strong><br />
1 Konstruktor + 1 Destruktor + n Zuweisungen</p>
<p><strong>Variable innerhalb der Schleife</strong><br />
n Konstruktoren + n Destruktoren</p>
<p>Wenn eine Zuweisung also teurer ist als einen Konstruktor und einen Destruktor zusammen, dann sollte die Variable ausserhalb der Schleife deklariert werden, erst recht wenn n eine sehr grosse Zahl annimmt.<br />
Ansonsten sollte man die Variable innerhalb der Schleife deklarieren. Auch wenn man vielleicht ein wenig Performance verliert, sollte noch die innere Variante vorgezogen werden, da die Variable dann im richtigen Scope vorhanden ist, bzw. was wichtig ist, dass sie im Scope ausserhalb nicht mehr vorhanden ist. Man hält somit seinen Scope sauber. Auch kann ein Kompiler zum Teil die Variante mit der Variable in der Schleife besser optimieren.</p>
<p>Im grossen und ganzen wird der Unterschied allerdings wohl eher klein sein.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1727460</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1727460</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 16 Jun 2009 09:51:31 GMT</pubDate></item><item><title><![CDATA[Reply to Variable in Schleife anlegen langsam? on Tue, 16 Jun 2009 10:48:20 GMT]]></title><description><![CDATA[<p>Knolle123 schrieb:</p>
<blockquote>
<p>Und wie das nen Unterschied macht es nen Unterschied, da erst ein Konstruktor und dann ein Zuweisungsoperator aufgerufen wird:<br />
Z.B.:<br />
...</p>
</blockquote>
<p>Ich habe Dein Beispiel mal um Zeitnahme und mehr Durchläufen durchgemessen. Bei beiden Fällen kommt (wie ich es erwartet habe) im Rahmen der Messgenauigkeit die gleiche Zeit raus. Natürlich habe ich die Ausgaben entfernt. Ich will ja nicht messen, wie schnell die Ausgabe auf cout läuft.</p>
<p>Bei solchen sehr einfachen Klassen, wo alles inline ist, hat der Compiler keine Probleme, jeglichen Overhead weg zu optimieren.</p>
<p>Das Resumee sollte sein: Traue deinem Compiler.</p>
<p>Wenn ich natürlich einen Konstruktor schreibe, der etwas <strong>signifikantes</strong> macht, dann ist das natürlich ein Unterschied, ob ich das ein mal oder mehrfach mache.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1727489</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1727489</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Tue, 16 Jun 2009 10:48:20 GMT</pubDate></item><item><title><![CDATA[Reply to Variable in Schleife anlegen langsam? on Tue, 16 Jun 2009 10:55:43 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>@Knolle123,<br />
Auch noch zwei andere Dinge hast du hier falsch gemacht. Du hast hier nicht Objekte gleichen Typs einander zugewiesen, sondern von unterschiedlichen Typen. Dadurch wird natürlich ein <code>cast</code> fällig. Auch hast du den Destruktor vergessen.<br />
Nimmst du allerdings diese Besonderheiten heraus, dann hast du das folgende:<br />
<strong>Variable ausserhalb der Schleife</strong><br />
1 Konstruktor + 1 Destruktor + n Zuweisungen</p>
<p><strong>Variable innerhalb der Schleife</strong><br />
n Konstruktoren + n Destruktoren</p>
</blockquote>
<p>Ok, in diesem einfachen Fall, dass genau ein Konstruktor existiert, der genau einen Parameter besitzt, kann ich mir einen operator=(int val) definieren, dann hab ich 1 Konstruktor, 1 Destruktor und n Zuweisungen. Das ist aber ein recht simpler Fall, der garantiert sehr oft nicht zutrifft.<br />
Da wird z.B. über einen Ergebnissatz eines SQL-Query iteriert, und aus den einzelnen Spalten die Argumente für den Konstruktor gezogen.<br />
In dem Fall ist es dann nämlich noch schlimmer (oder irr ich mich?)<br />
1 Konstruktor, 1 Destruktor, für temp. Objekte n Konstruktoren, n Zuweisungen, n Destruktoren. Oder überseh ich was?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1727492</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1727492</guid><dc:creator><![CDATA[Knolle123]]></dc:creator><pubDate>Tue, 16 Jun 2009 10:55:43 GMT</pubDate></item><item><title><![CDATA[Reply to Variable in Schleife anlegen langsam? on Tue, 16 Jun 2009 12:17:35 GMT]]></title><description><![CDATA[<p>Knolle123 schrieb:</p>
<blockquote>
<p>Ok, in diesem einfachen Fall, dass genau ein Konstruktor existiert, der genau einen Parameter besitzt, kann ich mir einen operator=(int val) definieren, dann hab ich 1 Konstruktor, 1 Destruktor und n Zuweisungen. Das ist aber ein recht simpler Fall, der garantiert sehr oft nicht zutrifft.</p>
</blockquote>
<p>Es geht nicht darum, dass du einen <code>operator=(int)</code> haben solltest, sondern dass du dem Objekt vom Typ Test nicht ein Objekt eines anderen Typs zuweist, sondern ebenfalle ein Objekt vom selben Typ. Die Konvertierung ist unüblich.</p>
<p>Knolle123 schrieb:</p>
<blockquote>
<p>Da wird z.B. über einen Ergebnissatz eines SQL-Query iteriert, und aus den einzelnen Spalten die Argumente für den Konstruktor gezogen.</p>
</blockquote>
<p>Und was machst du mit diesen Objekten? Das ist hier ein ganz spezieller Fall. Denn hier wirst du wahrscheinlich explizit Objekte konstruieren wollen und sie in einem Container abspeichern. Also ist die Schleife explizit für die Konvertierung und das Befüllen eines Containers gedacht. Sowas sind meistens eher Initialisierungsaufgaben und daher kommen sie seltener vor.</p>
<p>Knolle123 schrieb:</p>
<blockquote>
<p>Oder überseh ich was?</p>
</blockquote>
<p>Naja, wie gesagt, dass es eben ein spezieller Fall ist. Du willst nicht Objekte in einer Liste bearbeiten oder Objekte gleichen Typs behandeln, sondern eine Liste intialisieren und entsprechende Daten konvertieren. Es ist daher verständlich, dass nur der Aufruf eines Konstruktors, was auch eine Art von Konvertierung ist, bessere Ergebnisse erzielen kann, als wenn du die Daten konvertierst und noch temporär zwischenspeicherst.<br />
Aber auch übersehen tust du, dass ein Kompiler durchaus in der Lage ist zu optimieren.</p>
<p>Und ich verweise nochmals auf meine letzten paar Sätze. Es ist zum Teil schon von der Aufgabe oder den Klassen abhängig, wie man die Schleife aufbaut. Aber in den meisten Fällen ist der Unterschied nicht all zu gross oder man kann schlecht im voraus sagen, was schneller oder langsamer sein wird.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1727557</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1727557</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 16 Jun 2009 12:17:35 GMT</pubDate></item></channel></rss>