<?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[Performance Krimskrams]]></title><description><![CDATA[<p>Hallo, folgender Threat artet hoffentlich nicht in einen Flamewar aus, denn es wird um micro optimizing gehen <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="😃"
    /><br />
Wenn ich die Funktion memcpy aufrufe, welche Variante sollte ich bevorzugen, um die beste Performance zu erhalten?</p>
<pre><code class="language-cpp">size_t index=100;
int *p = new int [index];
int *q = new int [index];

memcpy(p, q, sizeof(int[index])); //Variante a
memcpy(p, q, sizeof(int)*index); //Variante b

const unsigned short var = sizeof(int);
memcpy(p, q, var*index); //variante c
</code></pre>
<p>Bei Variante b würde ja die Multiplikation &quot;Zeit rauben&quot;. Allerdings weis ich nicht, wie die Anzahl bytes bei Variante a ermittelt wird. Ist da etwas im Standard vorgeschrieben?<br />
Zu Variante c: Stellt sizeof(typ) eine Art Funktionsaufruf da? Oder wandelt das der Compiler beim Kompilieren in einen konstanten Wert um? Wenn Ersteres zutriff, würde es ja Sinn machen, denn Wert von sizeof(typ) in einer const Variablen zu speichern. Oder ist die zweite Variante durch den Standard vorgeschrieben? Wenn nein, wie kann ich sehen, wie mein kompiler sizeof() behandelt?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/239766/performance-krimskrams</link><generator>RSS for Node</generator><lastBuildDate>Tue, 22 Sep 2026 08:01:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/239766.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 27 Apr 2009 18:49:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Performance Krimskrams on Mon, 27 Apr 2009 18:49:07 GMT]]></title><description><![CDATA[<p>Hallo, folgender Threat artet hoffentlich nicht in einen Flamewar aus, denn es wird um micro optimizing gehen <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="😃"
    /><br />
Wenn ich die Funktion memcpy aufrufe, welche Variante sollte ich bevorzugen, um die beste Performance zu erhalten?</p>
<pre><code class="language-cpp">size_t index=100;
int *p = new int [index];
int *q = new int [index];

memcpy(p, q, sizeof(int[index])); //Variante a
memcpy(p, q, sizeof(int)*index); //Variante b

const unsigned short var = sizeof(int);
memcpy(p, q, var*index); //variante c
</code></pre>
<p>Bei Variante b würde ja die Multiplikation &quot;Zeit rauben&quot;. Allerdings weis ich nicht, wie die Anzahl bytes bei Variante a ermittelt wird. Ist da etwas im Standard vorgeschrieben?<br />
Zu Variante c: Stellt sizeof(typ) eine Art Funktionsaufruf da? Oder wandelt das der Compiler beim Kompilieren in einen konstanten Wert um? Wenn Ersteres zutriff, würde es ja Sinn machen, denn Wert von sizeof(typ) in einer const Variablen zu speichern. Oder ist die zweite Variante durch den Standard vorgeschrieben? Wenn nein, wie kann ich sehen, wie mein kompiler sizeof() behandelt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1702224</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1702224</guid><dc:creator><![CDATA[Zeitkritisch]]></dc:creator><pubDate>Mon, 27 Apr 2009 18:49:07 GMT</pubDate></item><item><title><![CDATA[Reply to Performance Krimskrams on Mon, 27 Apr 2009 19:18:07 GMT]]></title><description><![CDATA[<ol>
<li><code>sizeof</code> wird zur Kompilezeit ausgewertet. Sehr praktisch in der Templatemetaprogrammierung, da es als eine Art Ersatz für typeof dienen kann <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 />
2. Soweit ich weiss, würde Variant a 4 ergeben. Nämlich 4 Bytes für einen int auf einem 32 Bit System <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="😉"
    /><br />
3. Ich würde Variante b vorziehen, Variante c ist eigentlich genau das gleiche, nur eine unnötige zusätzliche Kurve, welche aber sehr wahrscheinlich wegoptimiert würde.</li>
</ol>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1702243</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1702243</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 27 Apr 2009 19:18:07 GMT</pubDate></item><item><title><![CDATA[Reply to Performance Krimskrams on Mon, 27 Apr 2009 19:26:56 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>2. Soweit ich weiss, würde Variant a 4 ergeben. Nämlich 4 Bytes für einen int auf einem 32 Bit System</p>
</blockquote>
<p>Nein</p>
<pre><code class="language-cpp">size_t index=100;
cout&lt;&lt;sizeof(int)*index;  //Ausgabe: 400
cout&lt;&lt;sizeof(int[index]); //Ausgabe: 400
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1702249</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1702249</guid><dc:creator><![CDATA[Zeitkritisch]]></dc:creator><pubDate>Mon, 27 Apr 2009 19:26:56 GMT</pubDate></item><item><title><![CDATA[Reply to Performance Krimskrams on Mon, 27 Apr 2009 20:26:54 GMT]]></title><description><![CDATA[<p>Oh, sorry, hab mich da verlesen. Dachte dort steht <code>q[index]</code> . Allerdings geht die Variante sowieso nicht wirklich:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

int main()
{
	int i;
	std::cin &gt;&gt; i;

	std::cout &lt;&lt; sizeof(int[i]) &lt;&lt; std::endl;

	return 0;
}
</code></pre>
<p>Führt zu einem Kompilerfehler, weil <code>i</code> nicht konstant ist. Ist dein <code>index</code> erst zur Laufzeit bekannt? Was wohl sehr wahrscheinlich der Fall sein wird, dann geht die Variante a sowieso nicht <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>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1702294</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1702294</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 27 Apr 2009 20:26:54 GMT</pubDate></item><item><title><![CDATA[Reply to Performance Krimskrams on Mon, 27 Apr 2009 20:50:37 GMT]]></title><description><![CDATA[<p>Ja, habe ich auch gerade erst gemerkt.<br />
Code::Blocks sagt nichts, aber VisualStudio 2008 Express heult rum <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="😃"
    /> trotzdem Danke <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/1702305</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1702305</guid><dc:creator><![CDATA[Zeitkritisch]]></dc:creator><pubDate>Mon, 27 Apr 2009 20:50:37 GMT</pubDate></item><item><title><![CDATA[Reply to Performance Krimskrams on Mon, 27 Apr 2009 21:36:23 GMT]]></title><description><![CDATA[<p>@Zeitkritisch:<br />
Die meisten Compiler werden wohl den selben Code erzeugen, egal was du verwendest. D.h. solange es so ein einfaches Beispiel wie bei dir ist, und der Compiler sicher sein kann, dass <code>index</code> zwischen der <code>=100</code> Zuweisung, und dem <code>memcpy</code> nicht modifiziert wird.</p>
<p>Generell ist das aber &quot;blunzn&quot;, weil der Unterschied wohl nicht merkbar sein wird.</p>
<p>Wenn du wirklich 100.1% sicher gehen willst, dann schreib doch einfach <code>sizeof(int) * 100</code> .</p>
<p>Wenn der Wert für <code>index</code> allerdings irgendwie dynamisch ermittelt wird, dann ist es erst wieder egal, da der Compiler sowieso eine Multiplikation (bzw. Shift-Instruction) generieren muss. Ganz egal mit welcher Syntax du es schreibst.</p>
<p>p.S.: da Shiften *sehr* schnell geht, ist es sogar &quot;ober-blunzn^2&quot;, also vergiss es einfach, und schreib es so, wie's am besten lesbar ist!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1702320</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1702320</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 27 Apr 2009 21:36:23 GMT</pubDate></item></channel></rss>