<?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[Wird der Compiler das optimieren?]]></title><description><![CDATA[<p>Hallo,</p>
<p>folgender Code:</p>
<pre><code class="language-cpp">double p[4][2] = { {-halfWidth,  halfLength},  { halfWidth,  halfLength },
		 { halfWidth, -halfLength }, {-halfWidth, -halfLength } };

for(int i=0; i &lt; 4; i++) {
   cPoints[i][0] = p[i][0] * cos(a) - p[i][1] * sin(a);	
   cPoints[i][1] = p[i][0] * sin(a) + p[i][1] * cos(a);	
}
</code></pre>
<p>Ist eine simple Schleife über array cPoints[4][2]. Nun hab ich in der Schleife 4mal sowas: p[i][0], also eine doppelte Derefernzierung. Nun frag ich mich: Wird der Compiler da wirklich Code für eine doppelte Array-Dereferenzierung einsetzen oder wird er kennen, dass er eigentlich gleich die Werte (halfWidth etc.) hardcoded in der Schleife einfügen kann (also z.B. -halfWidth statt p[i][0])?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/276330/wird-der-compiler-das-optimieren</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 10:18:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/276330.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 31 Oct 2010 12:23:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wird der Compiler das optimieren? on Sun, 31 Oct 2010 12:23:22 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>folgender Code:</p>
<pre><code class="language-cpp">double p[4][2] = { {-halfWidth,  halfLength},  { halfWidth,  halfLength },
		 { halfWidth, -halfLength }, {-halfWidth, -halfLength } };

for(int i=0; i &lt; 4; i++) {
   cPoints[i][0] = p[i][0] * cos(a) - p[i][1] * sin(a);	
   cPoints[i][1] = p[i][0] * sin(a) + p[i][1] * cos(a);	
}
</code></pre>
<p>Ist eine simple Schleife über array cPoints[4][2]. Nun hab ich in der Schleife 4mal sowas: p[i][0], also eine doppelte Derefernzierung. Nun frag ich mich: Wird der Compiler da wirklich Code für eine doppelte Array-Dereferenzierung einsetzen oder wird er kennen, dass er eigentlich gleich die Werte (halfWidth etc.) hardcoded in der Schleife einfügen kann (also z.B. -halfWidth statt p[i][0])?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1973072</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1973072</guid><dc:creator><![CDATA[compiFrage]]></dc:creator><pubDate>Sun, 31 Oct 2010 12:23:22 GMT</pubDate></item><item><title><![CDATA[Reply to Wird der Compiler das optimieren? on Sun, 31 Oct 2010 12:27:41 GMT]]></title><description><![CDATA[<p>Du berechnest sin und cos, aber machst dir um die 2 [] sorgen. <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="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1973073</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1973073</guid><dc:creator><![CDATA[ohahhubu]]></dc:creator><pubDate>Sun, 31 Oct 2010 12:27:41 GMT</pubDate></item><item><title><![CDATA[Reply to Wird der Compiler das optimieren? on Sun, 31 Oct 2010 12:34:58 GMT]]></title><description><![CDATA[<p>ohahhubu schrieb:</p>
<blockquote>
<p>Du berechnest sin und cos, aber machst dir um die 2 [] sorgen. <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="🙄"
    /></p>
</blockquote>
<p>Ich mache mir keine Sorgen, es interessiert mich einfach. Und die cos/sin kann ich nicht vermeiden, die Array Indizierungen vielleicht schon...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1973077</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1973077</guid><dc:creator><![CDATA[ohahhubu]]></dc:creator><pubDate>Sun, 31 Oct 2010 12:34:58 GMT</pubDate></item><item><title><![CDATA[Reply to Wird der Compiler das optimieren? on Sun, 31 Oct 2010 12:46:00 GMT]]></title><description><![CDATA[<p>Ich glaube er wird es nicht optimieren, da er wohl nicht annehmen kann, dass der Wert an der Adresse beim zweiten Aufruf noch der selbe ist (wenn ich richtig verstanden habe was du meinst). Schau dir doch einfach den Code an, den der Compiler generiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1973086</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1973086</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Sun, 31 Oct 2010 12:46:00 GMT</pubDate></item><item><title><![CDATA[Reply to Wird der Compiler das optimieren? on Sun, 31 Oct 2010 13:03:31 GMT]]></title><description><![CDATA[<p>brotbernd schrieb:</p>
<blockquote>
<p>Ich glaube er wird es nicht optimieren, da er wohl nicht annehmen kann, dass der Wert an der Adresse beim zweiten Aufruf noch der selbe ist (wenn ich richtig verstanden habe was du meinst). Schau dir doch einfach den Code an, den der Compiler generiert.</p>
</blockquote>
<p>Dazu müsste ich Assembler können..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1973091</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1973091</guid><dc:creator><![CDATA[compiFrage]]></dc:creator><pubDate>Sun, 31 Oct 2010 13:03:31 GMT</pubDate></item><item><title><![CDATA[Reply to Wird der Compiler das optimieren? on Sun, 31 Oct 2010 13:15:34 GMT]]></title><description><![CDATA[<p>Doppelte Derefernzierung sollten im Optimizer behandelt werden - aber ohne Gewähr!</p>
<p>Wenn du es wissen willst anstelle vom glauben musst du wohl bisschen Assembler lernen <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=":O"
      alt="😮"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1973097</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1973097</guid><dc:creator><![CDATA[Zeus]]></dc:creator><pubDate>Sun, 31 Oct 2010 13:15:34 GMT</pubDate></item><item><title><![CDATA[Reply to Wird der Compiler das optimieren? on Sun, 31 Oct 2010 13:52:18 GMT]]></title><description><![CDATA[<p>Ich denke nicht, dass dieser Zugriff gut optimiert werden kann, es sei denn es ist aus dem Zusammenhang klar, dass Zugriffe auf cPoint weder p noch etwas in p verändern können. Eventuell kann man da aber mit den strict-aliasing Schaltern, die fast alle Compiler kennen, etwas machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1973122</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1973122</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 31 Oct 2010 13:52:18 GMT</pubDate></item><item><title><![CDATA[Reply to Wird der Compiler das optimieren? on Sun, 31 Oct 2010 14:48:59 GMT]]></title><description><![CDATA[<p>Der Compiler wird schon checken dass &quot;p&quot; Alias-frei ist. Wird bloss leider nicht viel bringen, da ja abhängig von i ein anderer Wert referenziert wird, ist ja nicht immer -halfWidth für p[i][0].</p>
<p>Ginge höchstens wenn der Compiler sich entschliessen würde die Schleife aufzurollen, und das ist schwer einzuschätzen.</p>
<blockquote>
<p>Dazu müsste ich Assembler können..</p>
</blockquote>
<p>Na das solltest du wenn du auf der Ebene optimieren willst. Ist ja auch kein Ding, du musst ja bloss die wichtigsten paar Befehle kennen. So gut dass du in Assembler entwickeln könntest muss es lange nicht sein.</p>
<p>Wirklich Code für die &quot;doppelte Dereferenzierung&quot; sollte ein Compiler allerdings nicht erzeugen müssen. Der 2. Index ist jeweils Konstant, d.h. die Adresse der zu verwendenden Konstante ist <code>Basis + i * 16 + K</code> . Die Konstante K kann man in die Basis mit einrechnen, und &quot;plus Register*16&quot; ist eine Sache die wohl die meisten CPUs können werden. D.h. der Compiler wird maximal ein oder zwei Befehle generieren, je nachdem ob die CPU &quot;komplexe&quot; Adressierungsarten direkt unterstützt oder noch ein LEA (load effective address) notwendig ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1973146</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1973146</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 31 Oct 2010 14:48:59 GMT</pubDate></item><item><title><![CDATA[Reply to Wird der Compiler das optimieren? on Sun, 31 Oct 2010 15:07:12 GMT]]></title><description><![CDATA[<p>Warum nicht einfach per Hand unrollen?</p>
<pre><code class="language-cpp">double sin_a = std::sin(a);
double cos_a = std::cos(a);

double konstante_1 = halfWidth * sin_a;
double konstante_2 = -konstante_1;
double konstante_3 = halfWidth * cos_a;
double konstante_4 = -konstante_3;
double konstante_5 = halfLength * sin_a;
double konstante_6 = -konstante_5;
double konstante_7 = halflength * cos_a;
double konstante_8 = -konstante_8;

cPoints[0][0] = konstante_4 + konstante_6;
cPoints[0][1] = konstante_2 + konstante_7;
cPoints[1][0] = konstante_3 + konstante_6;
cPoints[1][1] = konstante_1 + konstante_7;
cPoints[2][0] = konstante_3 + konstante_5;
cPoints[2][1] = konstante_1 + konstante_8;
cPoints[3][0] = konstante_4 + konstante_5;
cPoints[3][1] = konstante_2 + konstante_8;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1973156</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1973156</guid><dc:creator><![CDATA[asdfasd]]></dc:creator><pubDate>Sun, 31 Oct 2010 15:07:12 GMT</pubDate></item><item><title><![CDATA[Reply to Wird der Compiler das optimieren? on Sun, 31 Oct 2010 16:09:18 GMT]]></title><description><![CDATA[<p>asdfasd schrieb:</p>
<blockquote>
<p>Warum nicht einfach per Hand unrollen?</p>
<pre><code class="language-cpp">double sin_a = std::sin(a);
double cos_a = std::cos(a);

double konstante_1 = halfWidth * sin_a;
double konstante_2 = -konstante_1;
double konstante_3 = halfWidth * cos_a;
double konstante_4 = -konstante_3;
double konstante_5 = halfLength * sin_a;
double konstante_6 = -konstante_5;
double konstante_7 = halflength * cos_a;
double konstante_8 = -konstante_8;

cPoints[0][0] = konstante_4 + konstante_6;
cPoints[0][1] = konstante_2 + konstante_7;
cPoints[1][0] = konstante_3 + konstante_6;
cPoints[1][1] = konstante_1 + konstante_7;
cPoints[2][0] = konstante_3 + konstante_5;
cPoints[2][1] = konstante_1 + konstante_8;
cPoints[3][0] = konstante_4 + konstante_5;
cPoints[3][1] = konstante_2 + konstante_8;
</code></pre>
</blockquote>
<p>Und jetzt versuch mal den Zeitunterschied zu messen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1973188</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1973188</guid><dc:creator><![CDATA[ohahhubu]]></dc:creator><pubDate>Sun, 31 Oct 2010 16:09:18 GMT</pubDate></item><item><title><![CDATA[Reply to Wird der Compiler das optimieren? on Sun, 31 Oct 2010 16:12:25 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">double konstante_8 = -konstante_8;
</code></pre>
<p>Das kann doch nicht gutgehen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1973190</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1973190</guid><dc:creator><![CDATA[Vicious Falcon]]></dc:creator><pubDate>Sun, 31 Oct 2010 16:12:25 GMT</pubDate></item><item><title><![CDATA[Reply to Wird der Compiler das optimieren? on Sun, 31 Oct 2010 17:02:17 GMT]]></title><description><![CDATA[<p>Warum?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1973224</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1973224</guid><dc:creator><![CDATA[Walli]]></dc:creator><pubDate>Sun, 31 Oct 2010 17:02:17 GMT</pubDate></item><item><title><![CDATA[Reply to Wird der Compiler das optimieren? on Sun, 31 Oct 2010 17:03:37 GMT]]></title><description><![CDATA[<p>Walli schrieb:</p>
<blockquote>
<p>Warum?</p>
</blockquote>
<p>Weil in der Variable danach Müll steht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1973225</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1973225</guid><dc:creator><![CDATA[this-*gt*that]]></dc:creator><pubDate>Sun, 31 Oct 2010 17:03:37 GMT</pubDate></item><item><title><![CDATA[Reply to Wird der Compiler das optimieren? on Sun, 31 Oct 2010 17:27:51 GMT]]></title><description><![CDATA[<p>Ja, hab eben in meiner Betriebsblindheit übersehen, dass initialisiert wird. &quot;a = -a&quot; ist ja in Ordnung, nur halt bei der Initialisierung nicht, weil nix vernünftiges drin stehen kann. Aber eigentlich ist ja auch &quot;double konstante_8 = -konstante_7;&quot; gemeint.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1973236</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1973236</guid><dc:creator><![CDATA[Walli]]></dc:creator><pubDate>Sun, 31 Oct 2010 17:27:51 GMT</pubDate></item><item><title><![CDATA[Reply to Wird der Compiler das optimieren? on Sun, 31 Oct 2010 23:41:05 GMT]]></title><description><![CDATA[<p>g++ produziert folgenden Code bei konstantem a:</p>
<pre><code class="language-asm">//vom Compiler vorberechnete +-sin/cos(a)-Werte:
	movsd	.LC1(%rip), %xmm11
	movsd	.LC2(%rip), %xmm0
	movsd	.LC3(%rip), %xmm10
	movsd	.LC4(%rip), %xmm9
	//xmm2=halfWidth und xmm3=halfLength
	movsd	40(%rsp), %xmm2
	movsd	32(%rsp), %xmm3
	movapd	%xmm2, %xmm4
	movapd	%xmm3, %xmm7
	xorpd	%xmm11, %xmm4
	xorpd	%xmm11, %xmm7
	movapd	%xmm3, %xmm12
	movapd	%xmm2, %xmm8
	movapd	%xmm4, %xmm6
	mulsd	%xmm10, %xmm12
	mulsd	%xmm0, %xmm6
	movapd	%xmm7, %xmm5
	mulsd	%xmm9, %xmm4
	mulsd	%xmm0, %xmm3
	mulsd	%xmm0, %xmm8
	mulsd	%xmm9, %xmm2
	movapd	%xmm6, %xmm13
	addsd	%xmm12, %xmm13
	mulsd	%xmm10, %xmm5
	movapd	%xmm4, %xmm15
	mulsd	%xmm0, %xmm7
	addsd	%xmm3, %xmm15
	addsd	%xmm8, %xmm12
	addsd	%xmm2, %xmm3
	addsd	%xmm5, %xmm8
	addsd	%xmm7, %xmm2
	addsd	%xmm6, %xmm5
	addsd	%xmm4, %xmm7
</code></pre>
<p>Wenn a nicht zur Kompilierzeit bekannt ist, kommt ein <code>call	sincos</code> gegen Anfang hinzu.<br />
Wie man sieht, bleibt hier von &quot;doppelter Dereferenzierung&quot; nicht viel übrig und es gibt auch keine Schleife mehr.<br />
Die Moral von der Geschicht' ist (wie immer), dass man Mikrooptimierungen meist besser dem Compiler überlässt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1973369</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1973369</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Sun, 31 Oct 2010 23:41:05 GMT</pubDate></item></channel></rss>