<?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[Gibt es ein memset() Template?]]></title><description><![CDATA[<p>Muss viele grössere Speicherbereiche zu Programmstart mit Konstanten Werten initialisieren. Da die Speichergrössen konstant sind, frage ich mich, ob es vielleicht ein Template von memset() gibt.</p>
<p>Oder was ist die effizienteste Möglichkeit Speicherbereiche zu initialisieren?</p>
<p>Danke schonmal!<br />
T.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/271702/gibt-es-ein-memset-template</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 06:25:46 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/271702.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 02 Aug 2010 15:12:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Gibt es ein memset() Template? on Mon, 02 Aug 2010 15:12:47 GMT]]></title><description><![CDATA[<p>Muss viele grössere Speicherbereiche zu Programmstart mit Konstanten Werten initialisieren. Da die Speichergrössen konstant sind, frage ich mich, ob es vielleicht ein Template von memset() gibt.</p>
<p>Oder was ist die effizienteste Möglichkeit Speicherbereiche zu initialisieren?</p>
<p>Danke schonmal!<br />
T.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1935217</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935217</guid><dc:creator><![CDATA[Tomahawk]]></dc:creator><pubDate>Mon, 02 Aug 2010 15:12:47 GMT</pubDate></item><item><title><![CDATA[Reply to Gibt es ein memset() Template? on Mon, 02 Aug 2010 15:21:44 GMT]]></title><description><![CDATA[<p>std::uninitialized_fill fällt mir da ein</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1935222</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935222</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Mon, 02 Aug 2010 15:21:44 GMT</pubDate></item><item><title><![CDATA[Reply to Gibt es ein memset() Template? on Mon, 02 Aug 2010 15:26:46 GMT]]></title><description><![CDATA[<p>Meinst du std::fill?</p>
<p>edit: Zu spät.</p>
<p>Der Unterschied zwischen fill und uninitialized_fill ist der, dass fill erwartet, dass dort schon ein Objekt liegt, während uninitialized_fill das Objekt vor Ort konstruiert. Nutze was immer in deinem Fall angebracht ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1935224</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935224</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 02 Aug 2010 15:26:46 GMT</pubDate></item><item><title><![CDATA[Reply to Gibt es ein memset() Template? on Mon, 02 Aug 2010 15:25:46 GMT]]></title><description><![CDATA[<p>Und dieses Setzen von Konstanten Werten ist der Teil deines Programms, der die Performance negativ beeinflusst?</p>
<p>Falls ja, dann hast du ein Problem, weil schneller als die Transferrate des Arbeitsspeichers wirst du eh nicht. Und das sollte <code>memset</code> schon ausschöpfen.</p>
<p>Falls nein, - und da gehe ich jetzt mal von aus - Premature Optimization ist keine gute Idee.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1935226</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935226</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 02 Aug 2010 15:25:46 GMT</pubDate></item><item><title><![CDATA[Reply to Gibt es ein memset() Template? on Mon, 02 Aug 2010 15:37:50 GMT]]></title><description><![CDATA[<p>ProgChild schrieb:</p>
<blockquote>
<p>Und dieses Setzen von Konstanten Werten ist der Teil deines Programms, der die Performance negativ beeinflusst?</p>
<p>Falls ja, dann hast du ein Problem, weil schneller als die Transferrate des Arbeitsspeichers wirst du eh nicht. Und das sollte <code>memset</code> schon ausschöpfen.</p>
<p>Falls nein, - und da gehe ich jetzt mal von aus - Premature Optimization ist keine gute Idee.</p>
</blockquote>
<p>Du hast schon recht!<br />
Meine Engine braucht braucht zu lange zum Starten, so dass es eine Verzögerung gibt, bevor der Benutzer arbeiten kann. Und das liegt an der Berechnung von KPK-Bitbases (Schach) und der Initialisierung von Hashspeichern und LUTs.</p>
<p>Ist ausserdem &quot;nur&quot; Feinschliff.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1935232</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935232</guid><dc:creator><![CDATA[Tomahawk]]></dc:creator><pubDate>Mon, 02 Aug 2010 15:37:50 GMT</pubDate></item><item><title><![CDATA[Reply to Gibt es ein memset() Template? on Mon, 02 Aug 2010 16:02:24 GMT]]></title><description><![CDATA[<p>Tomahawk schrieb:</p>
<blockquote>
<p>Du hast schon recht!<br />
Meine Engine braucht braucht zu lange zum Starten, so dass es eine Verzögerung gibt, bevor der Benutzer arbeiten kann. Und das liegt an der Berechnung von KPK-Bitbases (Schach) und der Initialisierung von Hashspeichern und LUTs.</p>
<p>Ist ausserdem &quot;nur&quot; Feinschliff.</p>
</blockquote>
<p>Und ein Profiler hat die jetzt <code>memset</code> als teuerste Funktion angezeigt? Kommt mir ein wenig seltsam vor, wenn du <code>memset</code> nur einmal für die Initialisierung verwendest. Bei heutigem Arbeitsspeicher kannst du mehr als ein GByte pro Sekunde schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1935240</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935240</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 02 Aug 2010 16:02:24 GMT</pubDate></item><item><title><![CDATA[Reply to Gibt es ein memset() Template? on Mon, 02 Aug 2010 16:29:07 GMT]]></title><description><![CDATA[<p>Ach, das soll dasselbe sein wie memset, nur dass der zu schreibende Wert eine Compilezeitkonstante ist? Ich hatte das wohl falsch verstanden.</p>
<p>Es gibt in manchen Umgebungen Funktionen wie bzero (BSD-Welt) oder ZeroMemory (Windows-Welt), die dasselbe wie memset(p, 0, n) machen. Aber ob das wirklich schneller als reines memset ist? Erstens hätte man es dann doch in die Standardlibrary aufgenommen (memzero z.B.), zweitens ist memset für gute Compiler eine intrinsische Funktion, d.h. sie generieren dafür spezielle Codemuster, statt einen Aufruf zu einer Libraryfunktion. Damit sollte memset in den meisten(oder immer?) Fällen schon optimalen Code liefern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1935250</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935250</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Mon, 02 Aug 2010 16:29:07 GMT</pubDate></item><item><title><![CDATA[Reply to Gibt es ein memset() Template? on Mon, 02 Aug 2010 16:59:20 GMT]]></title><description><![CDATA[<p>ProgChild schrieb:</p>
<blockquote>
<p>weil schneller als die Transferrate des Arbeitsspeichers wirst du eh nicht. Und das sollte <code>memset</code> schon ausschöpfen.</p>
</blockquote>
<p>Sollte ja, ist aber nicht immer so <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 />
MSVC + &quot;use intrinsics = yes&quot; =&gt; <code>rep stosb</code> =&gt; auf vielen CPUs relativ langsam</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1935267</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935267</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 02 Aug 2010 16:59:20 GMT</pubDate></item><item><title><![CDATA[Reply to Gibt es ein memset() Template? on Mon, 02 Aug 2010 17:50:56 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>ProgChild schrieb:</p>
<blockquote>
<p>weil schneller als die Transferrate des Arbeitsspeichers wirst du eh nicht. Und das sollte <code>memset</code> schon ausschöpfen.</p>
</blockquote>
<p>Sollte ja, ist aber nicht immer so <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 />
MSVC + &quot;use intrinsics = yes&quot; =&gt; <code>rep stosb</code> =&gt; auf vielen CPUs relativ langsam</p>
</blockquote>
<p>Nimnmt er auch rep, wenn die Größe zur Compilezeit unbekannt ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1935287</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935287</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 02 Aug 2010 17:50:56 GMT</pubDate></item><item><title><![CDATA[Reply to Gibt es ein memset() Template? on Mon, 02 Aug 2010 18:20:41 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>ProgChild schrieb:</p>
<blockquote>
<p>weil schneller als die Transferrate des Arbeitsspeichers wirst du eh nicht. Und das sollte <code>memset</code> schon ausschöpfen.</p>
</blockquote>
<p>Sollte ja, ist aber nicht immer so <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 />
MSVC + &quot;use intrinsics = yes&quot; =&gt; <code>rep stosb</code> =&gt; auf vielen CPUs relativ langsam</p>
</blockquote>
<p>Nimnmt er auch rep, wenn die Größe zur Compilezeit unbekannt ist?</p>
</blockquote>
<p>Ich glaube ja, müsste ich aber nochmal ausprobieren.</p>
<p>Ich glaube sogar, dass er nichtmal bei sehr grossen konstanten Werten (wo die Setup-Kosten gering im Vergleich zu den Gesamt-Kosten sind) schlau genug war, die Funktionen aufzurufen. Obwohl die bei grossen Werten um ein vielfaches schneller sind als die intrinsics.</p>
<p>Ich weiss nur noch sicher, dass ich extra ein <code>#pragma function(memset, memcpy)</code> in ein paar Source-Files reinmachen musste, damit er bei meinen Software-Blitting/Fill Funktionen nicht <code>rep stosb</code> bzw. <code>rep movsb</code> aus <code>memset()</code> bzw. <code>memcpy()</code> macht. Und da dabei die Grösse immer variabel war...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1935301</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935301</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 02 Aug 2010 18:20:41 GMT</pubDate></item><item><title><![CDATA[Reply to Gibt es ein memset() Template? on Mon, 02 Aug 2010 19:18:44 GMT]]></title><description><![CDATA[<p>ProgChild schrieb:</p>
<blockquote>
<p>Falls nein, - und da gehe ich jetzt mal von aus - Premature Optimization ist keine gute Idee.</p>
</blockquote>
<p>Und wieso nicht? Wenn ich weiß, wie ich effizient Speicherbereiche initialisiere, dann gewöhne ich mir das so an, egal ob es in dem konkreten Fall hier was bringt oder nicht. So lange es nicht umständlicher zu schreiben/lesen ist als was anderes, sehe ich hier kein Problem mit 'premature optimization'. Die ist nämlich nur die 'root of all evil', wenn man unnötigerweise Optimierungen einbaut, die nachher die Erweiterbarkeit und Lesbarkeit des Codes beeinflussen. Aber wenn ich z.B. einmal weiß, dass std::fill doppelt so schnell ist wie eine Schleife (stimmt i.d.R. nicht, nur als Beispiel), dann nehme ich das doch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1935318</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935318</guid><dc:creator><![CDATA[Walli]]></dc:creator><pubDate>Mon, 02 Aug 2010 19:18:44 GMT</pubDate></item><item><title><![CDATA[Reply to Gibt es ein memset() Template? on Mon, 02 Aug 2010 19:25:43 GMT]]></title><description><![CDATA[<p>Walli schrieb:</p>
<blockquote>
<p>Und wieso nicht?</p>
</blockquote>
<p>In diesem konkreten Fall, auf den ich mich hier beziehe, ist es keine gute Idee. Bevor ist <code>memset</code> schneller kriege, muss ich so viele plattform-spezifische Details berücksichtigen, dass ich mir sicher sein sollte, dass das wirklich mein Flaschenhals ist.</p>
<p>Mehr sage ich nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1935321</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935321</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 02 Aug 2010 19:25:43 GMT</pubDate></item><item><title><![CDATA[Reply to Gibt es ein memset() Template? on Mon, 02 Aug 2010 19:26:05 GMT]]></title><description><![CDATA[<p>Das ist mal wieder Theorie vs. Praxis <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="🙂"
    /> Was hindert den VC++ eigentlich, auch bei intrinsics dword-weise (oder was gerade optimal ist) zu arbeiten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1935322</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935322</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Mon, 02 Aug 2010 19:26:05 GMT</pubDate></item><item><title><![CDATA[Reply to Gibt es ein memset() Template? on Mon, 02 Aug 2010 23:11:21 GMT]]></title><description><![CDATA[<p>Bashar schrieb:</p>
<blockquote>
<p>Das ist mal wieder Theorie vs. Praxis <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="🙂"
    /> Was hindert den VC++ eigentlich, auch bei intrinsics dword-weise (oder was gerade optimal ist) zu arbeiten?</p>
</blockquote>
<p>Oops<br />
Erstmal die Antwort: nichts hindert ihn, nur VC6 hat es IIRC nicht gemacht.</p>
<p>Ich hätte vermutlich gleich dazuschreiben sollen dass ich das damals mit dem nunmehr sehr betagten VC6 getestet hatte <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>Gerade eben nochmal mit VC9 getestet, etwas ausführlicher, und VC9 ist viel viel schlauer <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>
<p>* mit <code>#pragma function(memset)</code> macht VC9 wie auch VC6 brav nen Funktionsaufruf</p>
<p>* mit <code>#pragma intrinsic(memset)</code> :<br />
... bei kleinen konstanten Werten wird ein Haufen <code>mov</code> draus (KEIN <code>rep</code> -Dreck mehr!)<br />
... bei grossen konstanten Werten wird trotzdem die Funktion <code>memset</code> aufgerufen<br />
... bei variablen Werten wird *immer* die Funktion <code>memset</code> aufgerufen (auch wenn die variablen Werte immer klein sind und man mit PGO compiliert)</p>
<p>Wobei der VC9 Optimizer auch schlau genug ist, die Intrinsic-Variante zu erzeugen, wenn eine Variable durch Inlining zu einem konstanten Ausdruch wird.</p>
<p>Noch ein paar Details:<br />
* die Grenze scheint bei 10x <code>mov</code> zu liegen. 38 Byte =&gt; 9x <code>mov DWORD</code> + 1x <code>mov WORD</code> , 39 Byte =&gt; memset, 40 Byte =&gt; <code>10x mov DWORD</code> , 41 Byte =&gt; memset<br />
* genau das selbe Verhalten ist beim Initialisieren von Stack-Arrays zu beobachten, nur dass beim Initialisieren von Stack-Arrays das <code>#pragma intrinsic/function</code> keine Rolle zu spielen scheint (d.h. Schwellenwert ist immer 10x mov)</p>
<p>p.S.: bei variablen Werten auch mit intrinsic &quot;optimal&quot; zu arbeiten ist glaube ich schwierig, weil der Code den man dafür brauch (die ganzen Fallunterscheidungen) schnell recht gross wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1935386</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935386</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 02 Aug 2010 23:11:21 GMT</pubDate></item><item><title><![CDATA[Reply to Gibt es ein memset() Template? on Mon, 02 Aug 2010 23:05:36 GMT]]></title><description><![CDATA[<p>Jetzt ist die Welt wieder in Ordnung.<br />
Und std::fill mit 0 wandelt er hoffentlich auch in memset um?<br />
Weil das wäre sehr schön, da nicht mehr an Mikrooptimierung denken zu müssen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1935390</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935390</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 02 Aug 2010 23:05:36 GMT</pubDate></item><item><title><![CDATA[Reply to Gibt es ein memset() Template? on Mon, 02 Aug 2010 23:55:58 GMT]]></title><description><![CDATA[<p>jain</p>
<p>std::fill für char/signed char/unsigned char = memset<br />
(keine compiler magic, sondern spezialisierung von _Fill in der std.lib)</p>
<p>std::fill für short/int/... mit kleiner konstanter grösse = unrolled loop als DWORD movs soweit möglich (unabhängig von der variablen-grösse, also auch 8x DWORD mov für 16 shorts)<br />
hier scheinen andere regeln zu gelten wie für intrinsic memset, z.b. macht er da auch bis zu 16x mov vs. nur bis max. 10x mov bei memset. auch greift hier das #pragma function nicht (was ja auch vollkommen OK ist).</p>
<p>std::fill für short/int/... mit grosser konstanter grösse = rep stos (bäh)</p>
<p>std::fill für short/int/... mit variabler grösse = einfacher loop (aber inlined)</p>
<p>p.S.: ob std::fill mit wert == 0 oder wert != 0 aufgerufen wird hat bei meinen versuchen keinen unterschied gemacht. z.B. std::fill für short wird entweder zu nem haufen DWORD movs oder zu nem rep stosw oder zu nem normalen movw loop. ganz egal ob wert == 0 oder wert == 1 oder wert == 0x0101.</p>
<p>p.p.S.: alles in allem würde ich sagen, dass man wohl trotzdem auf mikro-optimierungen verzichten kann. der code ist zwar nicht in jedem fall optimal, aber IMO gut genug für fast alle anwendungen.</p>
<p>p.p.p.S.: würde mich interessieren was GCC 4.x aus memset/std::fill macht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1935400</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935400</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 02 Aug 2010 23:55:58 GMT</pubDate></item><item><title><![CDATA[Reply to Gibt es ein memset() Template? on Tue, 03 Aug 2010 17:02:25 GMT]]></title><description><![CDATA[<p>Vielen Dank.</p>
<p>Ich habe versucht, den relevaten Code zu finden und zu pasten. Hoffentlich habe ich getroffen.</p>
<blockquote>
<p>std::fill für short/int/... mit grosser konstanter grösse = rep stos (bäh)</p>
</blockquote>
<pre><code class="language-cpp">int main()
{
	int arr[4096];
	cout&lt;&lt;arr[5]&lt;&lt;'\n';
	fill(arr,arr+4096,0);
	cout&lt;&lt;arr[5]&lt;&lt;'\n';
}
</code></pre>
<p>Die cout sind nur, um den Nutzcode zu finden. Fast. Ohne das zweite wird alles wegoptimiert.</p>
<pre><code>pxor	%xmm0, %xmm0
	leal	16(%esp), %eax
	leal	16400(%esp), %edx
	.p2align 4,,7
L3:
	movaps	%xmm0, (%eax)
	addl	$16, %eax
	cmpl	%edx, %eax
	jne	L3
</code></pre>
<p>Der scheint da mit mmx zu spielen. Ich glaube, das ist gut.</p>
<pre><code class="language-cpp">int main()
{
	int arr[4096];
	int i;
	cin&gt;&gt;i;
	cout&lt;&lt;arr[5]&lt;&lt;'\n';
	fill(arr,arr+i,0);
	cout&lt;&lt;arr[5]&lt;&lt;'\n';
}
</code></pre>
<p>wird zu</p>
<pre><code>pxor	%xmm0, %xmm0
	xorl	%eax, %eax
	.p2align 4,,7
L5:
	movl	%eax, %edx
	incl	%eax
	sall	$4, %edx
	cmpl	%esi, %eax
	movaps	%xmm0, (%ecx,%edx)
	jb	L5
</code></pre>
<pre><code class="language-cpp">struct Foo{
	virtual ~Foo(){
	}
};

int main()
{
	cout&lt;&lt;5&lt;&lt;'\n';
	Foo arr[4096];
	cout&lt;&lt;5&lt;&lt;'\n';
	cout&lt;&lt;&amp;arr&lt;&lt;'\n';
}
</code></pre>
<p>wird zu</p>
<pre><code>movl	%ebx, %eax
	.p2align 4,,7
L8:
	movl	$__ZTV3Foo+8, (%eax)
	movl	$__ZTV3Foo+8, 4(%eax)
	movl	$__ZTV3Foo+8, 8(%eax)
	movl	$__ZTV3Foo+8, 12(%eax)
	addl	$16, %eax
	cmpl	%esi, %eax
	jne	L8
</code></pre>
<p>Vierfaches unwinding.</p>
<pre><code class="language-cpp">struct Foo{
	int bar;
	Foo(){
		bar=3;
	}
	virtual ~Foo(){
	}
};

int main()
{
	cout&lt;&lt;5&lt;&lt;'\n';
	Foo arr[4096];
	cout&lt;&lt;5&lt;&lt;'\n';
	cout&lt;&lt;&amp;arr&lt;&lt;'\n';
}
</code></pre>
<p>wird zu</p>
<pre><code>movl	%ebx, %eax
	.p2align 4,,7
L8:
	movl	$__ZTV3Foo+8, (%eax)
	movl	$3, 4(%eax)
	addl	$8, %eax
	cmpl	%esi, %eax
	jne	L8
</code></pre>
<p>Und jetzt char[variabel]:</p>
<pre><code class="language-cpp">int main()
{
	char arr[4096];
	int i;
	cin&gt;&gt;i;
	cout&lt;&lt;arr[5]&lt;&lt;'\n';
	fill(arr,arr+i,0);
	cout&lt;&lt;arr[5]&lt;&lt;'\n';
}
</code></pre>
<p>wird zu</p>
<pre><code>pxor	%xmm0, %xmm0
	xorl	%eax, %eax
	.p2align 4,,7
L5:
	movl	%eax, %edx
	incl	%eax
	sall	$4, %edx
	cmpl	%eax, %edi
	movaps	%xmm0, (%ecx,%edx)
	ja	L5
	addl	24(%esp), %ecx
	movl	24(%esp), %edx
	cmpl	%edx, 28(%esp)
	je	L6
	.p2align 4,,7
L9:
	movb	$0, (%ecx)
	incl	%ecx
	cmpl	%ecx, %esi
	jne	L9
L6:
</code></pre>
<p>Mir scheint, es gibt GCC-Leute, die daran viel Spaß haben und Sachen machen, die normalerweise kein Arbeitgeber bezahllen würde.</p>
<p>Ups, memset vergessen hab.</p>
<pre><code class="language-cpp">int main()
{
	char arr[4096];
	int i;
	cin&gt;&gt;i;
	memset(arr,0,i);
	cout&lt;&lt;arr[5]&lt;&lt;'\n';
}
</code></pre>
<p>wird zu</p>
<pre><code>call	_memset
</code></pre>
<pre><code class="language-cpp">int main()
{
	char arr[4096];
	memset(arr,0,4096);
	cout&lt;&lt;arr[5]&lt;&lt;'\n';
}
</code></pre>
<p>wird zu</p>
<pre><code>call	_memset
</code></pre>
<pre><code class="language-cpp">memset(arr,0,8);
</code></pre>
<p>wird zu</p>
<pre><code>movl	$0, 23(%esp)
	movl	$0, 27(%esp)
	movb	$0, 31(%esp)
	movl	$1, 8(%esp)
</code></pre>
<pre><code class="language-cpp">memset(arr,0,32);
</code></pre>
<p>wird zu</p>
<pre><code>movl	%edx, %ecx
	xorl	%eax, %eax
	shrl	$2, %ecx
	testb	$2, %dl
	rep stosl
	je	L5
	movw	$0, (%edi)
	addl	$2, %edi
L5:
	andl	$1, %edx
	je	L6
	movb	$0, (%edi)
L6:
</code></pre>
<p>Oh. Er entscheiden anhand der Größe, welcher Inline-Code reingeknallt werden soll. Hier sieht man, daß er gar nicht bemerkt hat, daß am Ende das movw und movb nicht nötig gewesen wären. Ab 2049 ints nimmt er call memset.</p>
<p>Mir scheint, memset zu nehmen ist kontraproduktiv! Der memset-Speicher wird nur noch als Byte-Speicher gesehen. Durch memset verliert er Alignment-Informationen und die Größenteilbarekeit auch. Verliert mmx. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1935412</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935412</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 03 Aug 2010 17:02:25 GMT</pubDate></item><item><title><![CDATA[Reply to Gibt es ein memset() Template? on Tue, 03 Aug 2010 01:30:05 GMT]]></title><description><![CDATA[<blockquote>
<pre><code class="language-cpp">memset(arr,i,0)
</code></pre>
</blockquote>
<p>memset(ptr, <strong>value, size</strong>), nicht umgekehrt <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>BTW: ich verwende gerne derartige hilfsfunktionen um bestimmte optimierungen zu verhindern:<br />
(und gleichzeitig bestimmte stellen zu markieren)</p>
<pre><code class="language-cpp">void __declspec(noinline) observe(void* ptr)
{
    char dummy[123] = {};
    void** pp = reinterpret_cast&lt;void**&gt;(&amp;dummy[0]);
    pp[1] = ptr; // dank der führenden nullen in dummy erzeugt das OutputDebugStringA unten keine ausgabe
    ::OutputDebugStringA(dummy); // jetzt muss der compiler annehmen dass es einen alias für &quot;ptr&quot; gibt
}
</code></pre>
<p>Alternativ könnte man das vermutlich auch so schreiben:</p>
<pre><code class="language-cpp">volatile void* volatile g_ovservable_dummy = 0;

void __declspec(noinline) observe(void* ptr)
{
    g_ovservable_dummy = ptr;
    g_ovservable_dummy = 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1935417</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935417</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 03 Aug 2010 01:30:05 GMT</pubDate></item><item><title><![CDATA[Reply to Gibt es ein memset() Template? on Tue, 03 Aug 2010 06:44:08 GMT]]></title><description><![CDATA[<p>ProgChild schrieb:</p>
<blockquote>
<p>Walli schrieb:</p>
<blockquote>
<p>Und wieso nicht?</p>
</blockquote>
<p>In diesem konkreten Fall, auf den ich mich hier beziehe, ist es keine gute Idee. Bevor ist <code>memset</code> schneller kriege, muss ich so viele plattform-spezifische Details berücksichtigen, dass ich mir sicher sein sollte, dass das wirklich mein Flaschenhals ist.</p>
</blockquote>
<p>Es geht mir doch gerade in keiner Weise drum ob es ein Flaschenhals ist. Aber, wenn man den 'premature optimization'-Spruch bringt, dann doch am besten in Situationen, wo er angebracht ist. Also wenn jemand 200 statt 2 Zeilen schreibt um 3 Takte unnötigerweise (da kein Flaschenhals) zu sparen. Ob std::fill, memset oder Schleife ist von der Komplexität her für jemanden, der den Code noch einmal anpacken muss, letztlich egal. Von daher nehme ich doch das, was schöner ist und ggf. sogar vielleicht netterweise auf vielen Plattformen einen Tacken schneller. Sicher wird er mit diesen 'Optimierungen' keinen Blumentopf gewinnen, aber er wird sich auch nicht großartig damit den Code verhunzen. Außerdem sagte er doch nachher selber, dass es sich hier um 'Feinschliff' handelt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1935438</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935438</guid><dc:creator><![CDATA[Walli]]></dc:creator><pubDate>Tue, 03 Aug 2010 06:44:08 GMT</pubDate></item><item><title><![CDATA[Reply to Gibt es ein memset() Template? on Tue, 03 Aug 2010 09:27:26 GMT]]></title><description><![CDATA[<p>Walli schrieb:</p>
<blockquote>
<p>Von daher nehme ich doch das, was schöner ist und ggf. sogar vielleicht netterweise auf vielen Plattformen einen Tacken schneller. Sicher wird er mit diesen 'Optimierungen' keinen Blumentopf gewinnen, aber er wird sich auch nicht großartig damit den Code verhunzen. Außerdem sagte er doch nachher selber, dass es sich hier um 'Feinschliff' handelt.</p>
</blockquote>
<p>Wenn er nur ein ein <code>memset</code> durch ein <code>fill</code> ersetzt, dann würde ich dir zustimmen. Aber wer sagt denn, dass das die Lösung ist? Ihm ist sein Programm zu langsam und wenn die Initialisierung des Speichers wirklich der Flaschenhals ist, kann man sich durchaus ein paar Techniken überlegen, die ein paar Zeilen Code mehr verursachen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1935507</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935507</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 03 Aug 2010 09:27:26 GMT</pubDate></item></channel></rss>