<?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[Häufig benutzte Variablen in Schleifen innen &#x2F; außen deklarieren?]]></title><description><![CDATA[<p>Blöde Frage: Ist es schlechter Stil wenn man eine Variable ständig neu definiert in einem Schleifendurchgang?</p>
<pre><code class="language-cpp">// Variante 1
for (int i=0; i&lt;10; ++i)
{
    std::string str = Foo.getString();
    std::cout &lt;&lt; str &lt;&lt; std::endl;
}
</code></pre>
<p>oder ist dies besser:</p>
<pre><code class="language-cpp">// Variante 2
std::string str;
for (int i=0; i&lt;10; ++i)
{
    str = Foo.getString();
    std::cout &lt;&lt; str &lt;&lt; std::endl;
}
</code></pre>
<p>Ich finde Variante 1 leserlicher, bin mir nicht sicher, vielleicht optimiert der Compiler Variante 1 ohnehin zu Variante 2...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/217047/häufig-benutzte-variablen-in-schleifen-innen-außen-deklarieren</link><generator>RSS for Node</generator><lastBuildDate>Sun, 11 Oct 2026 00:41:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/217047.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 02 Jul 2008 12:53:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Häufig benutzte Variablen in Schleifen innen &#x2F; außen deklarieren? on Wed, 02 Jul 2008 12:53:06 GMT]]></title><description><![CDATA[<p>Blöde Frage: Ist es schlechter Stil wenn man eine Variable ständig neu definiert in einem Schleifendurchgang?</p>
<pre><code class="language-cpp">// Variante 1
for (int i=0; i&lt;10; ++i)
{
    std::string str = Foo.getString();
    std::cout &lt;&lt; str &lt;&lt; std::endl;
}
</code></pre>
<p>oder ist dies besser:</p>
<pre><code class="language-cpp">// Variante 2
std::string str;
for (int i=0; i&lt;10; ++i)
{
    str = Foo.getString();
    std::cout &lt;&lt; str &lt;&lt; std::endl;
}
</code></pre>
<p>Ich finde Variante 1 leserlicher, bin mir nicht sicher, vielleicht optimiert der Compiler Variante 1 ohnehin zu Variante 2...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1539687</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1539687</guid><dc:creator><![CDATA[cubeman]]></dc:creator><pubDate>Wed, 02 Jul 2008 12:53:06 GMT</pubDate></item><item><title><![CDATA[Reply to Häufig benutzte Variablen in Schleifen innen &#x2F; außen deklarieren? on Wed, 02 Jul 2008 13:09:27 GMT]]></title><description><![CDATA[<p>man muss das auf grund des einsatzes entscheiden. brauchst du den string NUR in der schleife, dann bleibt der auch da drin, also wird dort initalisiert und beim verlassen der schleife autmatisch gelöscht. das ist das gleiche wie mit der laufvariable i</p>
<pre><code class="language-cpp">for(unsigned int i = 0; i != 10; ++i)
  foo.bar();
</code></pre>
<p>wenn i soll nach der beendigung der schleife wieder aus dem speicher entfernt werden. und wenn du deinen string nun danach nicht mehr brauchst... dann schaut das so aus:</p>
<pre><code class="language-cpp">for(unsigned int i = 0; i != 10; ++i){
  std::string str(Foo.getString()); // bei initalisierung den c'tor verwenden und nicht die zuweisung :)
  std::cout &lt;&lt; str &lt;&lt; std::endl;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1539706</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1539706</guid><dc:creator><![CDATA[princess]]></dc:creator><pubDate>Wed, 02 Jul 2008 13:09:27 GMT</pubDate></item><item><title><![CDATA[Reply to Häufig benutzte Variablen in Schleifen innen &#x2F; außen deklarieren? on Wed, 02 Jul 2008 13:20:45 GMT]]></title><description><![CDATA[<p>Die Variante 2 ist besser, da bei der ersten Variante bei jedem Durchlauf Objekte auf dem Stack konstruiert und wieder zerstört werden müssen.</p>
<p>Mal davon abgesehen wird sowohl bei</p>
<pre><code class="language-cpp">std::string str(Foo.getString());
</code></pre>
<p>als auch bei</p>
<pre><code class="language-cpp">std::string str = Foo.getString();
</code></pre>
<p>der Copy-Ctor von std::string aufgerufen. Beide Varianten sind äquivalent.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1539717</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1539717</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 02 Jul 2008 13:20:45 GMT</pubDate></item><item><title><![CDATA[Reply to Häufig benutzte Variablen in Schleifen innen &#x2F; außen deklarieren? on Wed, 02 Jul 2008 13:21:38 GMT]]></title><description><![CDATA[<p>Ja, danke, das ist mir klar mit dem scope.</p>
<p>Meine Frage ist aber ob die str Variable bei jeder Iteration neu auf dem Stack angelegt wird, oder ob der Compiler das auf Variante 2 optimiert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1539719</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1539719</guid><dc:creator><![CDATA[cubeman]]></dc:creator><pubDate>Wed, 02 Jul 2008 13:21:38 GMT</pubDate></item><item><title><![CDATA[Reply to Häufig benutzte Variablen in Schleifen innen &#x2F; außen deklarieren? on Wed, 02 Jul 2008 13:22:08 GMT]]></title><description><![CDATA[<p>Das kommt wohl auf den Compiler an <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>MfG SideWinder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1539720</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1539720</guid><dc:creator><![CDATA[SideWinder]]></dc:creator><pubDate>Wed, 02 Jul 2008 13:22:08 GMT</pubDate></item><item><title><![CDATA[Reply to Häufig benutzte Variablen in Schleifen innen &#x2F; außen deklarieren? on Wed, 02 Jul 2008 13:25:47 GMT]]></title><description><![CDATA[<p>SideWinder schrieb:</p>
<blockquote>
<p>Das kommt wohl auf den Compiler an <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>MfG SideWinder</p>
</blockquote>
<p>Eigentlich nicht, da Scopes zu den garantierten Verhaltensweisen gehören.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1539724</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1539724</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 02 Jul 2008 13:25:47 GMT</pubDate></item><item><title><![CDATA[Reply to Häufig benutzte Variablen in Schleifen innen &#x2F; außen deklarieren? on Wed, 02 Jul 2008 14:11:36 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;conio.h&gt;
#include &lt;iostream&gt;
using namespace std;

class xINT //Testklasse
{
private:
  int num;
  static int countCtor;
  static int countDtor;
  static int countCopycon;
  static int countOpAssign;

public:
  xINT()
  {
      std::cout &lt;&lt; this &lt;&lt; &quot;: &quot; &lt;&lt; &quot;ctor&quot; &lt;&lt; std::endl;
      ++countCtor;
  }

 ~xINT()
  {
      std::cout &lt;&lt; this &lt;&lt; &quot;: &quot; &lt;&lt; &quot;dtor&quot; &lt;&lt; std::endl;
      ++countDtor;
  }

  xINT(const xINT&amp; x)
  {
      std::cout &lt;&lt; this &lt;&lt; &quot;: &quot; &lt;&lt; &quot;copycon von &quot; &lt;&lt; std::dec &lt;&lt; &amp;x &lt;&lt; std::endl;
      num = x.getNum();
      ++countCopycon;
  }

  xINT&amp; operator=(const xINT&amp; x)
  {
      if (&amp;x == this)
      {
          std::cout &lt;&lt; &quot;Selbstzuweisung mit op=&quot; &lt;&lt; std::endl;
      }
      std::cout &lt;&lt; this &lt;&lt; &quot;: &quot; &lt;&lt; &quot;op= von &quot; &lt;&lt; std::dec &lt;&lt; &amp;x &lt;&lt; std::endl;
      num = x.getNum();
      ++countOpAssign;
      return *this;
  }

  xINT&amp; operator=(const int i)
  {
      num = i;
      return *this;
  }

  int getNum() const {return num;}
  void setNum(int val) {num = val;}
  static void statistik(std::ostream&amp;);
  static void reset();
};

int xINT::countCtor     = 0;
int xINT::countDtor     = 0;
int xINT::countCopycon  = 0;
int xINT::countOpAssign = 0;

void xINT::statistik(std::ostream&amp; os)
{
  os   &lt;&lt; &quot;Ctor:    &quot; &lt;&lt; countCtor    &lt;&lt; std::endl
       &lt;&lt; &quot;Dtor:    &quot; &lt;&lt; countDtor    &lt;&lt; std::endl
       &lt;&lt; &quot;Copycon: &quot; &lt;&lt; countCopycon &lt;&lt; std::endl
       &lt;&lt; &quot;op=:     &quot; &lt;&lt; countOpAssign;
}

void xINT::reset()
{
    countCtor     = 0;
    countDtor     = 0;
    countCopycon  = 0;
    countOpAssign = 0;
}

std::ostream&amp; operator&lt;&lt; (std::ostream&amp; os, const xINT&amp; x)
{
  os &lt;&lt; x.getNum();
  return os;
}

std::istream&amp; operator&gt;&gt; (std::istream&amp; is, xINT&amp; x)
{
  int i;
  is &gt;&gt; i;
  x.setNum(i);
  return is;
}

bool operator&lt;  (const xINT&amp; a, const xINT&amp; b){return a.getNum() &lt;  b.getNum();}
bool operator&gt;  (const xINT&amp; a, const xINT&amp; b){return a.getNum() &gt;  b.getNum();}
bool operator== (const xINT&amp; a, const xINT&amp; b){return a.getNum() == b.getNum();}
bool operator!= (const xINT&amp; a, const xINT&amp; b){return a.getNum() != b.getNum();}

//----------------------------------------------------

int main()
{
    cout &lt;&lt; &quot;Variante 1&quot; &lt;&lt; endl;
    for (int i=0; i&lt;5; ++i)
    {
        xINT x;
        x = i;
        cout &lt;&lt; x &lt;&lt; endl;
    }
    cout &lt;&lt; endl;

    cout &lt;&lt; &quot;Variante 2&quot; &lt;&lt; endl;
    xINT x;
    for (int i=0; i&lt;5; ++i)
    {
        x = i;
        cout &lt;&lt; x &lt;&lt; endl;
    }

   getch();
}
</code></pre>
<pre><code>Variante 1
0x22ff40: ctor
0
0x22ff40: dtor
0x22ff40: ctor
1
0x22ff40: dtor
0x22ff40: ctor
2
0x22ff40: dtor
0x22ff40: ctor
3
0x22ff40: dtor
0x22ff40: ctor
4
0x22ff40: dtor

Variante 2
0x22ff40: ctor
0
1
2
3
4
0x22ff40: dtor
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1539763</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1539763</guid><dc:creator><![CDATA[Erhard Henkes]]></dc:creator><pubDate>Wed, 02 Jul 2008 14:11:36 GMT</pubDate></item><item><title><![CDATA[Reply to Häufig benutzte Variablen in Schleifen innen &#x2F; außen deklarieren? on Wed, 02 Jul 2008 14:10:28 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Die Variante 2 ist besser, da bei der ersten Variante bei jedem Durchlauf Objekte auf dem Stack konstruiert und wieder zerstört werden müssen.</p>
</blockquote>
<p>Dies ist ein weit verbreiteter Irrtum, dass dies zu langsameren Code führen muss!</p>
<p>Die Variante 1 (innen) ist nicht nur besser lesbar sondern ist auch der schnellere Code. Fülle ich den String mit 1000 Zeichen und erhöhe die Anzahl der Durchläufe von 10 auf 10000, so braucht die Variante 1 (innen) nur 14msec - die Variante 2 (außen) aber 17msec.<br />
Meiner Meinung nach liegt das daran, das in Variante 1 eben weniger (!) Kopien des Strings gemacht werden - wegen der 'Return Value Optimization'. Die ist genau dann möglich, wenn der String nach der Rückgabe aus 'getString()' erst angelegt wird.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1539764</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1539764</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 02 Jul 2008 14:10:28 GMT</pubDate></item><item><title><![CDATA[Reply to Häufig benutzte Variablen in Schleifen innen &#x2F; außen deklarieren? on Wed, 02 Jul 2008 14:13:25 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Die Variante 2 ist besser, da bei der ersten Variante bei jedem Durchlauf Objekte auf dem Stack konstruiert und wieder zerstört werden müssen.</p>
</blockquote>
<p>ist aber nur blöd bei c++ objekten, die konstruktoren/destruktoren aufrufen. bei einfachen typen wie int/long/char usw. macht das nix.<br />
<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/1539769</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1539769</guid><dc:creator><![CDATA[fricky]]></dc:creator><pubDate>Wed, 02 Jul 2008 14:13:25 GMT</pubDate></item><item><title><![CDATA[Reply to Häufig benutzte Variablen in Schleifen innen &#x2F; außen deklarieren? on Wed, 02 Jul 2008 14:22:04 GMT]]></title><description><![CDATA[<p><a href="http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&amp;faq=Optimize#Answ" rel="nofollow">http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&amp;faq=Optimize#Answ</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1539774</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1539774</guid><dc:creator><![CDATA[Erhard Henkes]]></dc:creator><pubDate>Wed, 02 Jul 2008 14:22:04 GMT</pubDate></item><item><title><![CDATA[Reply to Häufig benutzte Variablen in Schleifen innen &#x2F; außen deklarieren? on Wed, 02 Jul 2008 14:24:13 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<p>Tachyon schrieb:</p>
<blockquote>
<p>Die Variante 2 ist besser, da bei der ersten Variante bei jedem Durchlauf Objekte auf dem Stack konstruiert und wieder zerstört werden müssen.</p>
</blockquote>
<p>Dies ist ein weit verbreiteter Irrtum, dass dies zu langsameren Code führen muss!</p>
<p>Die Variante 1 (innen) ist nicht nur besser lesbar sondern ist auch der schnellere Code. Fülle ich den String mit 1000 Zeichen und erhöhe die Anzahl der Durchläufe von 10 auf 10000, so braucht die Variante 1 (innen) nur 14msec - die Variante 2 (außen) aber 17msec.<br />
Meiner Meinung nach liegt das daran, das in Variante 1 eben weniger (!) Kopien des Strings gemacht werden - wegen der 'Return Value Optimization'. Die ist genau dann möglich, wenn der String nach der Rückgabe aus 'getString()' erst angelegt wird.</p>
<p>Gruß<br />
Werner</p>
</blockquote>
<p>Hmm, sowohl mit gcc als auch mit msvc ist bei mir die Innen-Variante deutlich langsamer. Ca. Faktor 4 mit MSVC und ca. Faktor 5 bei g++.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1539780</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1539780</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 02 Jul 2008 14:24:13 GMT</pubDate></item><item><title><![CDATA[Reply to Häufig benutzte Variablen in Schleifen innen &#x2F; außen deklarieren? on Wed, 02 Jul 2008 14:25:32 GMT]]></title><description><![CDATA[<p>Du hast selbstverständlich den Releasemodus mit allen Optimierungen ausprobiert, oder? <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/1539783</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1539783</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 02 Jul 2008 14:25:32 GMT</pubDate></item><item><title><![CDATA[Reply to Häufig benutzte Variablen in Schleifen innen &#x2F; außen deklarieren? on Wed, 02 Jul 2008 14:26:09 GMT]]></title><description><![CDATA[<p>Hallo Erhard,</p>
<p>in Zeile 48 fehlt noch die Ausgabe, dass hier ein 'int' zugewiesen wird, und in Zeile 105 und 115 darf es nicht</p>
<pre><code class="language-cpp">xINT x;
        x = i;
</code></pre>
<p>heißen sondern</p>
<pre><code class="language-cpp">xINT x = getXInt();
</code></pre>
<p>mit</p>
<pre><code class="language-cpp">xINT getXInt() { return xINT(); }
</code></pre>
<p>dann sieht der Output zwichen den Varianten etwas ausgeglichener aus.</p>
<p>Nämlich:</p>
<pre><code>Variante 1
0012FF60: ctor
1245120
0012FF60: dtor
0012FF60: ctor
1245120
0012FF60: dtor
0012FF60: ctor
1245120
0012FF60: dtor
0012FF60: ctor
1245120
0012FF60: dtor
0012FF60: ctor
1245120
0012FF60: dtor

Variante 2
0012FF5C: ctor
0012FF64: ctor
0012FF5C: op= von 0012FF64
0012FF64: dtor
4200151
0012FF64: ctor
0012FF5C: op= von 0012FF64
0012FF64: dtor
4200151
0012FF64: ctor
0012FF5C: op= von 0012FF64
0012FF64: dtor
4200151
0012FF64: ctor
0012FF5C: op= von 0012FF64
0012FF64: dtor
4200151
0012FF64: ctor
0012FF5C: op= von 0012FF64
0012FF64: dtor
4200151
</code></pre>
<p>.. und plötzlich ist viel mehr Aktion bei Variante 2 !</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1539785</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1539785</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 02 Jul 2008 14:26:09 GMT</pubDate></item><item><title><![CDATA[Reply to Häufig benutzte Variablen in Schleifen innen &#x2F; außen deklarieren? on Wed, 02 Jul 2008 14:52:00 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Du hast selbstverständlich den Releasemodus mit allen Optimierungen ausprobiert, oder? <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>Nein, ahbe ich nicht. Um an sowas zu denken, bin ich zu dämlich. <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/1539787</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1539787</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 02 Jul 2008 14:52:00 GMT</pubDate></item><item><title><![CDATA[Reply to Häufig benutzte Variablen in Schleifen innen &#x2F; außen deklarieren? on Wed, 02 Jul 2008 14:38:21 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/7393">@Werner</a> Salomon: Right Sir! <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="🙂"
    /><br />
Jetzt wird es endlich praktisch. <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/1539795</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1539795</guid><dc:creator><![CDATA[Erhard Henkes]]></dc:creator><pubDate>Wed, 02 Jul 2008 14:38:21 GMT</pubDate></item><item><title><![CDATA[Reply to Häufig benutzte Variablen in Schleifen innen &#x2F; außen deklarieren? on Wed, 02 Jul 2008 14:43:31 GMT]]></title><description><![CDATA[<p>Es gibt einen Fall, in dem beide Varianten gleich schnell sind, und zwar dann, wenn ich beide Varianten zusammen in ein Executable packe. Erstelle ich aber für beide Varianten getrennte Executables, ist die &quot;Innen&quot;-Variante immer langsamer als die &quot;Außen&quot;-Variante.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1539800</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1539800</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 02 Jul 2008 14:43:31 GMT</pubDate></item><item><title><![CDATA[Reply to Häufig benutzte Variablen in Schleifen innen &#x2F; außen deklarieren? on Wed, 02 Jul 2008 14:50:12 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>LordJaxom schrieb:</p>
<blockquote>
<p>Du hast selbstverständlich den Releasemodus mit allen Optimierungen ausprobiert, oder? <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>Nein, ahbe ich nicht. Um an sowas zu denken, bin ich zu dämlich.</p>
</blockquote>
<p>Entschuldige, das wusste ich natürlich nicht. Kannst Du das in Deine Signatur schreiben? Dann sieht man es gleich und muss nicht fragen...</p>
<p>(Muss ich noch einen Smiley anbringen, um den humoristischen Charakter dieses Statements zu entschärfen? <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="😃"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /> )</p>
<p>Spaß beiseite: Nicht nur Neulinge, auch erfahrene Forenbesucher dürfen gerne jegliche potentiell hilfreichen Angaben machen, um ein Problem oder eine Lösung nachzuvollziehen. Mich interessiert das Thema und natürlich auch Dein Test, sonst hätte ich nicht nachgefragt. Allerdings komme ich bei meinen lokalen Tests nur auf Faktor 1,5 - 2 (MSVC++ 8.0), da wäre es schon schön die Unterschiede zu kennen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1539806</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1539806</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 02 Jul 2008 14:50:12 GMT</pubDate></item><item><title><![CDATA[Reply to Häufig benutzte Variablen in Schleifen innen &#x2F; außen deklarieren? on Wed, 02 Jul 2008 14:54:49 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Tachyon schrieb:</p>
<blockquote>
<p>LordJaxom schrieb:</p>
<blockquote>
<p>Du hast selbstverständlich den Releasemodus mit allen Optimierungen ausprobiert, oder? <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>Nein, ahbe ich nicht. Um an sowas zu denken, bin ich zu dämlich.</p>
</blockquote>
<p>Entschuldige, das wusste ich natürlich nicht. Kannst Du das in Deine Signatur schreiben? Dann sieht man es gleich und muss nicht fragen...</p>
<p>(Muss ich noch einen Smiley anbringen, um den humoristischen Charakter dieses Statements zu entschärfen? <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="😃"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /> )</p>
</blockquote>
<p>Sorry, ich habe meinerseits den Smily unterschlagen. <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>Immerhin scheinst Du auch einen Unterschied feststellen zu können. Ich habe hier einen relativ lahmen Firmenrechner mit einem P4. Vielleicht erklären sich daraus irgendwelche Unterschiede.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1539808</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1539808</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 02 Jul 2008 14:54:49 GMT</pubDate></item><item><title><![CDATA[Reply to Häufig benutzte Variablen in Schleifen innen &#x2F; außen deklarieren? on Wed, 02 Jul 2008 15:00:43 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Spaß beiseite: Nicht nur Neulinge, auch erfahrene Forenbesucher dürfen gerne jegliche potentiell hilfreichen Angaben machen, um ein Problem oder eine Lösung nachzuvollziehen. Mich interessiert das Thema und natürlich auch Dein Test, sonst hätte ich nicht nachgefragt. Allerdings komme ich bei meinen lokalen Tests nur auf Faktor 1,5 - 2 (MSVC++ 8.0), da wäre es schon schön die Unterschiede zu kennen.</p>
</blockquote>
<p>Hallo LordJaxom,</p>
<p>mein Code sieht so aus:</p>
<pre><code class="language-cpp">// includes ..
struct S
{
    std::string getString() const
    {
        return std::string( 1024, 'x' );
    }
};

int main()
{
    S Foo;
    sam::Watch uhr;
    std::cout.setstate( std::ios_base::failbit );
    {
        sam::Watch::Stopper stopper(  uhr );
        // std::string str;
        for (int i=0; i&lt;10000; ++i)
        {
            std::string str = Foo.getString();
            std::cout &lt;&lt; str &lt;&lt; std::endl;
        }
    }
    std::cout.clear();
    std::cout &lt;&lt; &quot;benötigte Zeit. &quot; &lt;&lt; uhr &lt;&lt; std::endl;
    return 0;
}
</code></pre>
<p>damit erreiche ich das Verhältnis 17msec für Variante 1 und 20msec für Variante 2 (MS-VC8). Die zuerst genannten Werte (14msec zu 17msec) erreiche ich mit einem leeren std::ostream.</p>
<p>Die Zeitmessung geschieht mit dem 'QueryPerformanceCounter' aus der WinAPI (Code nicht gepostet).</p>
<p>Ich denke, es hängt viel davon ab, wie die Funktion aussieht, die den String liefert.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1539811</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1539811</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 02 Jul 2008 15:00:43 GMT</pubDate></item><item><title><![CDATA[Reply to Häufig benutzte Variablen in Schleifen innen &#x2F; außen deklarieren? on Wed, 02 Jul 2008 15:23:40 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Es gibt einen Fall, in dem beide Varianten gleich schnell sind, und zwar dann, wenn ich beide Varianten zusammen in ein Executable packe. Erstelle ich aber für beide Varianten getrennte Executables, ist die &quot;Innen&quot;-Variante immer langsamer als die &quot;Außen&quot;-Variante.</p>
</blockquote>
<p>Was hat das mit der Executable zu tun?<br />
Die innenvariante ist die schnellere wenn man sie nicht explizit aushebelt wie es erhard getan hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1539822</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1539822</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Wed, 02 Jul 2008 15:23:40 GMT</pubDate></item><item><title><![CDATA[Reply to Häufig benutzte Variablen in Schleifen innen &#x2F; außen deklarieren? on Wed, 02 Jul 2008 15:24:00 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<p>Ich denke, es hängt viel davon ab, wie die Funktion aussieht, die den String liefert.</p>
</blockquote>
<p>Das denke ich auch. Ich habe jetzt auch eine Version gebastelt, wo beide Varianten identische Ergebnisse liefern.<br />
Wenn man direkt aus einem std::string kopiert sieht es wieder ganz anders aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1539823</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1539823</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 02 Jul 2008 15:24:00 GMT</pubDate></item><item><title><![CDATA[Reply to Häufig benutzte Variablen in Schleifen innen &#x2F; außen deklarieren? on Wed, 02 Jul 2008 15:25:14 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Tachyon schrieb:</p>
<blockquote>
<p>Es gibt einen Fall, in dem beide Varianten gleich schnell sind, und zwar dann, wenn ich beide Varianten zusammen in ein Executable packe. Erstelle ich aber für beide Varianten getrennte Executables, ist die &quot;Innen&quot;-Variante immer langsamer als die &quot;Außen&quot;-Variante.</p>
</blockquote>
<p>Was hat das mit der Executable zu tun?<br />
Die innenvariante ist die schnellere wenn man sie nicht explizit aushebelt wie es erhard getan hat.</p>
</blockquote>
<p>Das hat damit zu tun, wie und ob vor einer Variante schon Speicher allokiert wurde, oder nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1539824</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1539824</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 02 Jul 2008 15:25:14 GMT</pubDate></item><item><title><![CDATA[Reply to Häufig benutzte Variablen in Schleifen innen &#x2F; außen deklarieren? on Wed, 02 Jul 2008 15:25:56 GMT]]></title><description><![CDATA[<p>Wenn es wirklich auf diesen Geschwindigkeitsunterschied ankommt, sollte man im jeweils echten Fall beide Varianten bezüglich Zeitverbrauch testen. Dann kann man entsprechend den Prioritäten entscheiden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1539825</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1539825</guid><dc:creator><![CDATA[Erhard Henkes]]></dc:creator><pubDate>Wed, 02 Jul 2008 15:25:56 GMT</pubDate></item><item><title><![CDATA[Reply to Häufig benutzte Variablen in Schleifen innen &#x2F; außen deklarieren? on Wed, 02 Jul 2008 15:36:42 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Das hat damit zu tun, wie und ob vor einer Variante schon Speicher allokiert wurde, oder nicht.</p>
</blockquote>
<p>Äh... nein.</p>
<p>Die innen Variante ist nur abhängig von der RVO. Wenn RVO funktioniert ist die innenvariante schneller oder gleichschnell. Wenn RVO nicht funktioniert ist sie langsamer.</p>
<p>RVO heisst, dass man exakt N ctor und N dtor aufrufe hat (in der schleife) unabhängig von den externen faktoren.</p>
<p>wenn keine RVO funktioniert, hat man N ctor aufrufe, N copyctor aufrufe und 2*N dtor aufrufe.</p>
<p>während es bei der aussen variante 1 ctor, N op=, N ctor, N+1 dtor aufrufe sind.</p>
<p>und das hat nichts mit der funktion zu tun die die daten liefert - sofern sie ein passendes objekt liefert und wir keine konvertierungen haben. denn dann wird es komplex.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1539830</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1539830</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Wed, 02 Jul 2008 15:36:42 GMT</pubDate></item><item><title><![CDATA[Reply to Häufig benutzte Variablen in Schleifen innen &#x2F; außen deklarieren? on Wed, 02 Jul 2008 16:48:46 GMT]]></title><description><![CDATA[<p>Oha, meine Frage war gar nicht so blöd <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>Das mit der Schleife mit dem string war nur ein vereinfachtes Beispiel. Genau genommen habe ich eine 2D Vektor Klasse, wo ich bei einem Vektor eine Komponente verändern will.</p>
<p>Ich habs mal getestet, alle vier Varianten bringen keine nennenswerten Unterschiede bei mir:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;windows.h&gt;

using namespace std;

class Vector2D
{
public:
	Vector2D(int x_ = 0, int y_ = 0) : x(x_), y(y_) {}
	int getX() { return x; }
	int getY() { return y; }
	void setX(int newx) { x = newx; }
	void setY(int newy) { y = newy; }
	int x, y;	// zum Testen public
};

Vector2D&amp; getSomeVector()
{
	static Vector2D s_foo(1,2);
	return s_foo;
};

int main()
{
	const long LOOPCOUNT = 1000000;
	cout.setstate( ios_base::failbit );

	// Variante 1 (innen)
	DWORD startticks = GetTickCount ();
	for (int i = 0; i &lt; LOOPCOUNT; ++i)
	{
		Vector2D myVec = getSomeVector();
		myVec.setX (3);
		cout &lt;&lt; myVec.getX () &lt;&lt; endl;
	}
	cout.clear();
	cout &lt;&lt; &quot;Variante 1 (innen) brauchte:   &quot; &lt;&lt; (GetTickCount ()-startticks) &lt;&lt; &quot;ms&quot; &lt;&lt; endl;
	cout.setstate( ios_base::failbit );

	// Variante 2 (aussen)
	Vector2D myVec;
	startticks = GetTickCount ();
	for (int i = 0; i &lt; LOOPCOUNT; ++i)
	{
		myVec = getSomeVector();
		myVec.setX (3);
		cout &lt;&lt; myVec.getX () &lt;&lt; endl;
	}
	cout.clear();
	cout &lt;&lt; &quot;Variante 2 (aussen) brauchte:  &quot; &lt;&lt; (GetTickCount ()-startticks) &lt;&lt; &quot;ms&quot; &lt;&lt; endl;
	cout.setstate( ios_base::failbit );

	// Variante 3 (set/get)
	startticks = GetTickCount ();
	for (int i = 0; i &lt; LOOPCOUNT; ++i)
	{
		myVec.setY (getSomeVector().getY());
		myVec.setX (3);
		cout &lt;&lt; myVec.getX () &lt;&lt; endl;
	}
	cout.clear();
	cout &lt;&lt; &quot;Variante 3 (set/get) brauchte: &quot; &lt;&lt; (GetTickCount ()-startticks) &lt;&lt; &quot;ms&quot; &lt;&lt; endl;
	cout.setstate( ios_base::failbit );

	// Variante 4 (member)
	startticks = GetTickCount ();
	for (int i = 0; i &lt; LOOPCOUNT; ++i)
	{
		myVec.y = getSomeVector().y;
		myVec.x = 3;
		cout &lt;&lt; myVec.getX () &lt;&lt; endl;
	}
	cout.clear();
	cout &lt;&lt; &quot;Variante 4 (member) brauchte:  &quot; &lt;&lt; (GetTickCount ()-startticks) &lt;&lt; &quot;ms&quot; &lt;&lt; endl;
	return 0;
}
</code></pre>
<p>So wie es ausschaut bleibe ich bei der Innenvariante. Ist klar, verschmutzt keinen Scope und ist schnell genug <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1539880</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1539880</guid><dc:creator><![CDATA[cubeman]]></dc:creator><pubDate>Wed, 02 Jul 2008 16:48:46 GMT</pubDate></item><item><title><![CDATA[Reply to Häufig benutzte Variablen in Schleifen innen &#x2F; außen deklarieren? on Wed, 02 Jul 2008 17:18:39 GMT]]></title><description><![CDATA[<p>Man achte auf die Kapazität der Strings. Sie weist darauf hin dass in Beispiel 1 immer dynamisch Speicher angefordert / freigegeben wird. Damit erübrigt sich wohl die Frage, was schneller ist (Ich hab's nicht nachgemessen ;)).</p>
<pre><code class="language-cpp">using namespace std;

	for(int i = 0; i &lt; 100; ++i)
	{
		string s;

		cout &lt;&lt; s.capacity() &lt;&lt; '\n';

		s += string(50, 'a');
	}
</code></pre>
<pre><code class="language-cpp">using namespace std;

	string s;

	for(int i = 0; i &lt; 100; ++i)
	{
		s.clear();

		cout &lt;&lt; s.capacity() &lt;&lt; '\n';

		s += string(50, 'a');
	}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1539892</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1539892</guid><dc:creator><![CDATA[__Stefan__]]></dc:creator><pubDate>Wed, 02 Jul 2008 17:18:39 GMT</pubDate></item></channel></rss>