<?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[Optimierung möglich?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich kompiliere hier gerade folgenden code mit maximaler Optimierung:</p>
<pre><code class="language-cpp">#include &lt;cstdio&gt;
#include &lt;tuple&gt;

struct something {
	unsigned int get_size() {
		return 4;
	}
};

struct something_else {
	unsigned int get_size() {
		return 5;
	}
};

template&lt; unsigned int... Indices &gt;
struct index_list
{
};

template&lt; typename... Args, unsigned int... Indices &gt;
void test_func(index_list&lt;Indices...&gt;, Args &amp;&amp; ... args )
{
	std::tuple&lt; Args... &gt; tuple(args...);

	const unsigned int array[] = {
		std::get&lt;Indices&gt;(tuple).get_size()...
	};

	for (unsigned int i = 0; i &lt; sizeof...(Indices); ++i) {
		std::printf(&quot;%u&quot;, array[i]);
	}
}

int main(int argc, char* argv[])
{
	test_func( index_list&lt;0, 1, 2, 3&gt;(), something(), something_else(), something(), something_else() );

	return 0;
}
</code></pre>
<p>Was mich wundert ist, dass der Compiler (Visual C++ 2013 ctp) hier nicht auf die Idee gekommen ist, dass das Array mit Werten gefüllt wurde, die zur Compile-Zeit bekannt sind und es somit komplett entfernt und einfach die Konstanten verwendet:</p>
<pre><code>mov	DWORD PTR _array$1[ebp], 4
	mov	DWORD PTR _array$1[ebp+4], 5
	mov	DWORD PTR _array$1[ebp+8], 4
	mov	DWORD PTR _array$1[ebp+12], 5

; ...
$LL5@main:

; 31   : std::printf(&quot;%u&quot;, array[i]);
; Einfache Schleife hier, die auf das array zugreift
	push	DWORD PTR _array$1[ebp+esi*4]
	push	OFFSET ??_C@_02GMHACPFF@?$CFu?$AA@
	call	edi
	inc	esi
	add	esp, 8
	cmp	esi, 4
	jb	SHORT $LL5@main
</code></pre>
<p>Darf der Compiler das nicht tun, weil ich gerade irgendeinen Nebeneffekt übersehe?<br />
Das Beispiel mag gerade blöd aussehen, aber genau so ein Konstrukt erhalte ich in meiner Skript-Binding-Bibliothek.<br />
Ich könnte den Code so gestalten, dass er davon ausgeht, dass die Zahlen konstant sind (also static const member...), aber dann funktioniert das nicht mehr für Fälle wo das nicht so ist. Ich hätte gehofft, dass der Compiler eben den Standardfall so optimiert <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>Viele Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/319794/optimierung-möglich</link><generator>RSS for Node</generator><lastBuildDate>Fri, 24 Jul 2026 20:59:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/319794.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 03 Sep 2013 14:48:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Optimierung möglich? on Tue, 03 Sep 2013 14:48:43 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich kompiliere hier gerade folgenden code mit maximaler Optimierung:</p>
<pre><code class="language-cpp">#include &lt;cstdio&gt;
#include &lt;tuple&gt;

struct something {
	unsigned int get_size() {
		return 4;
	}
};

struct something_else {
	unsigned int get_size() {
		return 5;
	}
};

template&lt; unsigned int... Indices &gt;
struct index_list
{
};

template&lt; typename... Args, unsigned int... Indices &gt;
void test_func(index_list&lt;Indices...&gt;, Args &amp;&amp; ... args )
{
	std::tuple&lt; Args... &gt; tuple(args...);

	const unsigned int array[] = {
		std::get&lt;Indices&gt;(tuple).get_size()...
	};

	for (unsigned int i = 0; i &lt; sizeof...(Indices); ++i) {
		std::printf(&quot;%u&quot;, array[i]);
	}
}

int main(int argc, char* argv[])
{
	test_func( index_list&lt;0, 1, 2, 3&gt;(), something(), something_else(), something(), something_else() );

	return 0;
}
</code></pre>
<p>Was mich wundert ist, dass der Compiler (Visual C++ 2013 ctp) hier nicht auf die Idee gekommen ist, dass das Array mit Werten gefüllt wurde, die zur Compile-Zeit bekannt sind und es somit komplett entfernt und einfach die Konstanten verwendet:</p>
<pre><code>mov	DWORD PTR _array$1[ebp], 4
	mov	DWORD PTR _array$1[ebp+4], 5
	mov	DWORD PTR _array$1[ebp+8], 4
	mov	DWORD PTR _array$1[ebp+12], 5

; ...
$LL5@main:

; 31   : std::printf(&quot;%u&quot;, array[i]);
; Einfache Schleife hier, die auf das array zugreift
	push	DWORD PTR _array$1[ebp+esi*4]
	push	OFFSET ??_C@_02GMHACPFF@?$CFu?$AA@
	call	edi
	inc	esi
	add	esp, 8
	cmp	esi, 4
	jb	SHORT $LL5@main
</code></pre>
<p>Darf der Compiler das nicht tun, weil ich gerade irgendeinen Nebeneffekt übersehe?<br />
Das Beispiel mag gerade blöd aussehen, aber genau so ein Konstrukt erhalte ich in meiner Skript-Binding-Bibliothek.<br />
Ich könnte den Code so gestalten, dass er davon ausgeht, dass die Zahlen konstant sind (also static const member...), aber dann funktioniert das nicht mehr für Fälle wo das nicht so ist. Ich hätte gehofft, dass der Compiler eben den Standardfall so optimiert <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>Viele Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2350057</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2350057</guid><dc:creator><![CDATA[NixZurSacheTuer]]></dc:creator><pubDate>Tue, 03 Sep 2013 14:48:43 GMT</pubDate></item><item><title><![CDATA[Reply to Optimierung möglich? on Tue, 03 Sep 2013 14:56:56 GMT]]></title><description><![CDATA[<p>Schon mit constexpr probiert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2350060</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2350060</guid><dc:creator><![CDATA[wusu]]></dc:creator><pubDate>Tue, 03 Sep 2013 14:56:56 GMT</pubDate></item><item><title><![CDATA[Reply to Optimierung möglich? on Tue, 03 Sep 2013 15:01:01 GMT]]></title><description><![CDATA[<p>constexpr möchte ich hier ja gerade nicht verwenden (weil die aufgerufenen Funktionen nicht ZWANGSWEISE konstante Werte liefern sollen), und nebenbei unterstützt VC++2013 auch noch gar kein constexpr, glaube ich, aber wie gesagt, möchte ich sowieso nicht verwenden, dann könnte ich auch gleich static const member verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2350061</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2350061</guid><dc:creator><![CDATA[NixZurSacheTuer]]></dc:creator><pubDate>Tue, 03 Sep 2013 15:01:01 GMT</pubDate></item><item><title><![CDATA[Reply to Optimierung möglich? on Tue, 03 Sep 2013 15:06:08 GMT]]></title><description><![CDATA[<p>Vorschlag zur Optimierung:</p>
<pre><code>template&lt; typename... Args, unsigned int... Indices &gt;
void test_func(index_list&lt;Indices...&gt;, Args &amp;&amp; ... args )
{
    std::tuple&lt; Args... &gt; tuple{ std::forward&lt;Args&gt;(args)... };

	bool _[] = { std::cout &lt;&lt; std::get&lt;Indices&gt;(tuple).get_size()... };
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2350062</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2350062</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Tue, 03 Sep 2013 15:06:08 GMT</pubDate></item><item><title><![CDATA[Reply to Optimierung möglich? on Tue, 03 Sep 2013 15:18:15 GMT]]></title><description><![CDATA[<p>das std::forward da bringt leider MSVC++2013 zum Absturz, daher habe ich es in meinem Beispiel wieder herausnehmen müssen.<br />
Ich hätte gerne vermieden, dass ich an allen Stellen, an denen ich die Elemente des Arrays brauche, wieder irgendein Hilfs-Template expandieren muss, so wie Du es vorschlägst.<br />
Ich brauche an bestimmten Stellen halt die Summe der Funktionswerte von 0 bis X, oder die Summe aller Werte usw.. In dem Fall, dass es keine statischen Berechnungen sind, befürchte ich, dass der Compiler dann den Code für prinzipiell unveränderte Werte mehrfach erzeugt <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2350068</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2350068</guid><dc:creator><![CDATA[NixZurSacheTuer]]></dc:creator><pubDate>Tue, 03 Sep 2013 15:18:15 GMT</pubDate></item><item><title><![CDATA[Reply to Optimierung möglich? on Tue, 03 Sep 2013 15:25:15 GMT]]></title><description><![CDATA[<blockquote>
<p>das std::forward da bringt leider MSVC++2013 zum Absturz, daher habe ich es in meinem Beispiel wieder herausnehmen müssen.</p>
</blockquote>
<p>Was zum...!? Ein einfaches <code>forward</code> ? VC++*, du $&amp;@]? <strong>!</strong></p>
<blockquote>
<p>Ich hätte gerne vermieden, dass ich an allen Stellen, an denen ich die Elemente des Arrays brauche, wieder irgendein Hilfs-Template expandieren muss, so wie Du es vorschlägst.</p>
</blockquote>
<p>Das ist doch kein Template. Nur ein kleiner Trick.</p>
<blockquote>
<p>Ich brauche an bestimmten Stellen halt die Summe der Funktionswerte von 0 bis X, oder die Summe aller Werte usw</p>
</blockquote>
<p>Und hier kommt die brillante Welt der Template-Metaprogrammierung. <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>~* Für alle Leute, die es noch nicht kapiert haben: Ich flame permanent gegen den Compiler, nicht gegen die IDE..~ <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/2350072</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2350072</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Tue, 03 Sep 2013 15:25:15 GMT</pubDate></item><item><title><![CDATA[Reply to Optimierung möglich? on Tue, 03 Sep 2013 15:30:08 GMT]]></title><description><![CDATA[<p>Naja, das ist halt ein Fehler in einer Beta... habe ihn schon angezeigt... Vermute aber mal, dass er auch schon anderen Leuten aufgefallen ist.<br />
Ich probiere mal, ob der Optimierer noch hinterherkommt, wenn ich mir Hilfstemplates bastele, die konstante Funkionswerte aufsummieren... Dann sieht's hinterher wenigstens nicht mehr ganz so unleserlich aus... Kommt dann nur drauf an, was er macht, wenn er mal keinen konstanten Wert vorfindet...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2350073</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2350073</guid><dc:creator><![CDATA[NixZurSacheTuer]]></dc:creator><pubDate>Tue, 03 Sep 2013 15:30:08 GMT</pubDate></item><item><title><![CDATA[Reply to Optimierung möglich? on Tue, 03 Sep 2013 15:46:07 GMT]]></title><description><![CDATA[<p>Okay, alles klar...<br />
Der Compiler kann das Array zwar nicht wegoptimieren, aber wenn ich die Berechnung an allen Stellen wo ich die Ergebnisse brauche in-place mit Template-Magie berechne, dann erkennt er die statische Natur und optimiert zu den Konstanten, wie sie auch im Array lägen... Hätte ich in Anbtracht der Array-Sache gar nicht angenommen, so werde ich das jetzt umsetzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2350077</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2350077</guid><dc:creator><![CDATA[NixZurSacheTuer]]></dc:creator><pubDate>Tue, 03 Sep 2013 15:46:07 GMT</pubDate></item></channel></rss>