<?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[Compiler optimiert nur wenn die Memberfunktion static ist?!]]></title><description><![CDATA[<p>Hey Leute,<br />
hab ein komisches Performance-Problem. Ich nutzt Visual C++ 2005 und folgenden Code:</p>
<pre><code class="language-cpp">#include &lt;boost/array.hpp&gt;

typedef boost::array&lt;char, 60000&gt; ArrayType;

class Test
{
public:
	static ArrayType getArray()
	{
		ArrayType arr;
		return arr;
	}
};

int main()
{
	for(int i = 0; i &lt; 2000000; ++i)
	{
		Test test;
		test.getArray();
	}
}
</code></pre>
<p>Wenn die Memberfunktion getArray static ist, ist das Programm innerhalb weniger Millisekunden fertig. Mach ich allerdings das static weg dann braucht der Code ungefähr 1 Minute auf meinem Rechner. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>Es hat auch etwas mit der Array-Größe zu tun. Wenn ich das static weglasse und die Größe von 60000 auf z.B. 1000 ändere gehts auch ruck zuck.</p>
<p>Bin auf eine Erklärung gespannt. <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/161948/compiler-optimiert-nur-wenn-die-memberfunktion-static-ist</link><generator>RSS for Node</generator><lastBuildDate>Sat, 12 Sep 2026 01:30:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/161948.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 12 Oct 2006 14:16:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Compiler optimiert nur wenn die Memberfunktion static ist?! on Thu, 12 Oct 2006 14:16:11 GMT]]></title><description><![CDATA[<p>Hey Leute,<br />
hab ein komisches Performance-Problem. Ich nutzt Visual C++ 2005 und folgenden Code:</p>
<pre><code class="language-cpp">#include &lt;boost/array.hpp&gt;

typedef boost::array&lt;char, 60000&gt; ArrayType;

class Test
{
public:
	static ArrayType getArray()
	{
		ArrayType arr;
		return arr;
	}
};

int main()
{
	for(int i = 0; i &lt; 2000000; ++i)
	{
		Test test;
		test.getArray();
	}
}
</code></pre>
<p>Wenn die Memberfunktion getArray static ist, ist das Programm innerhalb weniger Millisekunden fertig. Mach ich allerdings das static weg dann braucht der Code ungefähr 1 Minute auf meinem Rechner. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>Es hat auch etwas mit der Array-Größe zu tun. Wenn ich das static weglasse und die Größe von 60000 auf z.B. 1000 ändere gehts auch ruck zuck.</p>
<p>Bin auf eine Erklärung gespannt. <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/1153654</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1153654</guid><dc:creator><![CDATA[komisch]]></dc:creator><pubDate>Thu, 12 Oct 2006 14:16:11 GMT</pubDate></item><item><title><![CDATA[Reply to Compiler optimiert nur wenn die Memberfunktion static ist?! on Thu, 12 Oct 2006 14:20:57 GMT]]></title><description><![CDATA[<p>static member liegen nur ein mal für alle Instanzen von einem Objekt im Speicher. D.h. in dem Fall: Es gibt ein Array für alle Instanzen von Test.<br />
Lässt du das static weg, gibt's halt so viele Arrays, wie du Instanzen von Test anlegst, in dem Fall so an die 2000000.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1153664</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1153664</guid><dc:creator><![CDATA[GPC]]></dc:creator><pubDate>Thu, 12 Oct 2006 14:20:57 GMT</pubDate></item><item><title><![CDATA[Reply to Compiler optimiert nur wenn die Memberfunktion static ist?! on Thu, 12 Oct 2006 14:23:10 GMT]]></title><description><![CDATA[<p>Mach das so:</p>
<pre><code class="language-cpp">ArrayType getArray()
    {
        return ArrayType();
    }
</code></pre>
<p>und das geht furchbar schnell <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>BR<br />
Vinzenz</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1153668</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1153668</guid><dc:creator><![CDATA[evilissimo]]></dc:creator><pubDate>Thu, 12 Oct 2006 14:23:10 GMT</pubDate></item><item><title><![CDATA[Reply to Compiler optimiert nur wenn die Memberfunktion static ist?! on Thu, 12 Oct 2006 14:39:01 GMT]]></title><description><![CDATA[<p>GPC: Es geht doch hier um eine static Member<strong>funktion</strong>.</p>
<p>evilissimo: Stimmt, aber das ist nicht wirklich eine Lösung, ich muss das Array ja noch in der Funktion füllen. Hab das Beispiel nur auf allernötigste minimiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1153686</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1153686</guid><dc:creator><![CDATA[komisch]]></dc:creator><pubDate>Thu, 12 Oct 2006 14:39:01 GMT</pubDate></item><item><title><![CDATA[Reply to Compiler optimiert nur wenn die Memberfunktion static ist?! on Thu, 12 Oct 2006 15:02:59 GMT]]></title><description><![CDATA[<p>komisch schrieb:</p>
<blockquote>
<p>GPC: Es geht doch hier um eine static Member<strong>funktion</strong>.</p>
</blockquote>
<p>Ja. (Ich liebe Feststellungen ohne Informationsgehalt und ohne weiterführende Frage <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> *scnr*)</p>
<p>EDIT:<br />
Aber weil ich mal nicht so sein will - ich weiss worauf Du hinaus willst.</p>
<p>Interessant ist im VS2005 immer, sich den disassemblierten Code anzuschauen. Im static-Fall wird ein leeres Objekt &quot;test&quot; konstruiert (leer, weil keine Members). Danach wird die Funktion Test::getArray() aufgerufen und der Rückgabewert verworfen. Vermutlich merkt der Optimierer, dass in Test::getArray() auch nichts passiert was auf die Aussenwelt Einfluss hat. Im Disassembly sieht man dann, dass die for-Schleife garnicht erst übersetzt wird.</p>
<p>EDIT2: Diese These lässt sich dadurch untermauern dass wenn man in Test::getArray() eine globale Variable modifiziert, diese nicht wegoptimiert wird.</p>
<p>Ohne static wird ein leeres Objekt &quot;test&quot; konstruiert, danach die Funktion Test::getArray( this:=test ) aufgerufen und der Rückgabewert verworfen. Hier kann man jetzt nur noch raten, aber ich schätze der Optimierer ist hier damit überfordert festzustellen, dass das auch keine Seiteneffekte hat, jedenfalls ist die Schleife in diesem Fall im Disassembly vollständig enthalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1153691</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1153691</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 12 Oct 2006 15:02:59 GMT</pubDate></item><item><title><![CDATA[Reply to Compiler optimiert nur wenn die Memberfunktion static ist?! on Thu, 12 Oct 2006 17:24:45 GMT]]></title><description><![CDATA[<p>der scheint keine return value optimization zu machen. ich habe mal testweise einen copy-constructor in boost::array eingefügt wo memcpy aufgerufen wird und den optimiert er in der release version weg. vielleicht hat der vc++8 probleme mit der optimierung von default-copy-konstruktoren? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
wenn er keine rvo macht dann werden ja gigabyte weise daten kopiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1153839</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1153839</guid><dc:creator><![CDATA[torstn]]></dc:creator><pubDate>Thu, 12 Oct 2006 17:24:45 GMT</pubDate></item><item><title><![CDATA[Reply to Compiler optimiert nur wenn die Memberfunktion static ist?! on Thu, 12 Oct 2006 18:13:51 GMT]]></title><description><![CDATA[<p>torstn schrieb:</p>
<blockquote>
<p>der scheint keine return value optimization zu machen.</p>
</blockquote>
<p>Hast Du dazu auch ein passendes Codebeispiel? Bei dem da oben kann imho garkeine RVO gemacht werden, weil es garkein Empfangsfeld gibt wo der RV hinoptimiert werden könnte...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1153870</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1153870</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 12 Oct 2006 18:13:51 GMT</pubDate></item><item><title><![CDATA[Reply to Compiler optimiert nur wenn die Memberfunktion static ist?! on Thu, 12 Oct 2006 18:30:34 GMT]]></title><description><![CDATA[<p>na ja ich denke mal da könnte der compiler ja einfach nen dummy erstellen. aber hier der code.</p>
<pre><code class="language-cpp">#include &lt;cstring&gt; // memcpy

class Array
{
public:
	Array()
	{
	}

	Array(const Array&amp; arr)
	{
		std::memcpy(&amp;elements_[0], &amp;arr.elements_[0], sizeof(elements_));
	}
private:
	char elements_[60000];
};

class Test
{
public:
    Array getArray()
    {
        Array arr;
        return arr;
    }
};

int main()
{
    for(int i = 0; i &lt; 2000000; ++i)
    {
        Test test;
	Array arr = test.getArray();
    }
}
</code></pre>
<p>das ist das beispiel wo er optimiert. wenn man jetzt den copy-constructor auskommentiert wirds lahm.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1153873</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1153873</guid><dc:creator><![CDATA[torstn]]></dc:creator><pubDate>Thu, 12 Oct 2006 18:30:34 GMT</pubDate></item></channel></rss>