<?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[boost::array - Semantik]]></title><description><![CDATA[<p>Hiho!</p>
<p>Ich verwende ein boost::array um ein Array aus einer Funktion zurueckzugeben. Jetzt wollte ich wissen ob boost::arrays das ueberhaupt ermoeglichen und falls ja, wie aufwaendig sowas ist.</p>
<p>Im Grunde mach ich sowas:</p>
<pre><code class="language-cpp">typedef boost::array&lt;int, N&gt; FooArray;

FooArray createArray()
{
	Foo a = createFoo(...);
	Foo b = createFoo(...);
	Foo c = createFoo(...);
	FooArray retval = {{a, b, c}}; // (1)
	return retval;
}
</code></pre>
<p>Folgende Fragen:<br />
a) wird in (1) fuer jedes in retval eingefuegte Element der Copy-Ctor aufgerufen?<br />
b) kann ein FooArray kopiert werden? Falls ja: werden dann alle enthaltenen Elemente auch kopiert?<br />
c) gibts eine elegantere Art, Arrays aus einer Funktion zurueck zu geben?<br />
d) wie schreib ich eigentlich selbst einen operator=, der eine Initialisierungsliste akzeptiert wie die in (1)?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/205389/boost-array-semantik</link><generator>RSS for Node</generator><lastBuildDate>Fri, 09 Oct 2026 03:03:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/205389.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 13 Feb 2008 19:33:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to boost::array - Semantik on Wed, 13 Feb 2008 19:33:54 GMT]]></title><description><![CDATA[<p>Hiho!</p>
<p>Ich verwende ein boost::array um ein Array aus einer Funktion zurueckzugeben. Jetzt wollte ich wissen ob boost::arrays das ueberhaupt ermoeglichen und falls ja, wie aufwaendig sowas ist.</p>
<p>Im Grunde mach ich sowas:</p>
<pre><code class="language-cpp">typedef boost::array&lt;int, N&gt; FooArray;

FooArray createArray()
{
	Foo a = createFoo(...);
	Foo b = createFoo(...);
	Foo c = createFoo(...);
	FooArray retval = {{a, b, c}}; // (1)
	return retval;
}
</code></pre>
<p>Folgende Fragen:<br />
a) wird in (1) fuer jedes in retval eingefuegte Element der Copy-Ctor aufgerufen?<br />
b) kann ein FooArray kopiert werden? Falls ja: werden dann alle enthaltenen Elemente auch kopiert?<br />
c) gibts eine elegantere Art, Arrays aus einer Funktion zurueck zu geben?<br />
d) wie schreib ich eigentlich selbst einen operator=, der eine Initialisierungsliste akzeptiert wie die in (1)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1455317</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1455317</guid><dc:creator><![CDATA[Blue-Tiger]]></dc:creator><pubDate>Wed, 13 Feb 2008 19:33:54 GMT</pubDate></item><item><title><![CDATA[Reply to boost::array - Semantik on Wed, 13 Feb 2008 19:42:19 GMT]]></title><description><![CDATA[<p>a) Kommt auf boost::array an. Denke schon.<br />
b) Richtig.<br />
c) Referenzen.<br />
d) Ja, aber das ist wohl etwas zu schwer für dich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1455328</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1455328</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Wed, 13 Feb 2008 19:42:19 GMT</pubDate></item><item><title><![CDATA[Reply to boost::array - Semantik on Wed, 13 Feb 2008 19:51:59 GMT]]></title><description><![CDATA[<p>(D)Evil schrieb:</p>
<blockquote>
<p>c) Referenzen.</p>
</blockquote>
<p>Kannst du mir dafuer mal ein Beispiel zeigen? Oder meinst du einfach sowas wie</p>
<pre><code class="language-cpp">void createArray(FooArray* arrayThatStoresTheReturnValues)
{
    // ...
}
</code></pre>
<p>?</p>
<blockquote>
<p>d) Ja, aber das ist wohl etwas zu schwer für dich.</p>
</blockquote>
<p>DASS es geht ist mir klar, das war auch nicht die Frage. Die Frage war, _WIE_ es geht <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1455341</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1455341</guid><dc:creator><![CDATA[Blue-Tiger]]></dc:creator><pubDate>Wed, 13 Feb 2008 19:51:59 GMT</pubDate></item><item><title><![CDATA[Reply to boost::array - Semantik on Wed, 13 Feb 2008 21:26:40 GMT]]></title><description><![CDATA[<p>Blue-Tiger schrieb:</p>
<blockquote>
<pre><code class="language-cpp">typedef boost::array&lt;int, N&gt; FooArray;

FooArray createArray()
{
	Foo a = createFoo(...);
	Foo b = createFoo(...);
	Foo c = createFoo(...);
	FooArray retval = {{a, b, c}}; // (1)
	return retval;
}
</code></pre>
<p>d) wie schreib ich eigentlich selbst einen operator=, der eine Initialisierungsliste akzeptiert wie die in (1)?</p>
</blockquote>
<p>Gar nicht.<br />
1. Ein Zuweisungsoperator ist hier nicht im Spiel (und ein Konstruktor auch nicht, denn int ist keine Klasse), höchtens ein Konvertierungsoperator, je nachdem, was Foo ist.<br />
2. Eine Aggregatinitialisierungsliste kann mit boost::array (bzw. std::tr1::array) verwendet werden, weil array - ganz bewusst - als POD konzipiert ist.</p>
<p>Mit der gegenwärtigen Sprache ist so eine Initialisierungssyntax für Klassen im Allgemeinen ist nicht möglich. Im nächsten Standard wird das wahrscheinlich anders aussehen.</p>
<p>Blue-Tiger schrieb:</p>
<blockquote>
<p>c) gibts eine elegantere Art, Arrays aus einer Funktion zurueck zu geben?</p>
</blockquote>
<p><em>Noch</em> eleganter? Was soll das sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1455453</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1455453</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 13 Feb 2008 21:26:40 GMT</pubDate></item><item><title><![CDATA[Reply to boost::array - Semantik on Wed, 13 Feb 2008 21:28:12 GMT]]></title><description><![CDATA[<p>Nicht zurück geben, aber sowas ist eleganter:</p>
<pre><code class="language-cpp">void foo(arr&amp; dest)
{ /* fill dest */ }
</code></pre>
<p>... sparst du dir das kopieren ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1455463</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1455463</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Wed, 13 Feb 2008 21:28:12 GMT</pubDate></item><item><title><![CDATA[Reply to boost::array - Semantik on Wed, 13 Feb 2008 21:33:42 GMT]]></title><description><![CDATA[<p>(D)Evil schrieb:</p>
<blockquote>
<p>Nicht zurück geben, aber sowas ist eleganter:</p>
<pre><code class="language-cpp">void foo(arr&amp; dest)
{ /* fill dest */ }
</code></pre>
<p>... sparst du dir das kopieren ...</p>
</blockquote>
<p>Dafür opferst du damit die einfache Initialisierung und benötigst zusätzlich ein bereits konstruiertes Objekt. Effizienter ist das jedenfalls nicht, und Eleganz vermisse ich auch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1455466</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1455466</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 13 Feb 2008 21:33:42 GMT</pubDate></item><item><title><![CDATA[Reply to boost::array - Semantik on Wed, 13 Feb 2008 22:06:21 GMT]]></title><description><![CDATA[<p>? Ob ich jetzt folgendes mache:</p>
<pre><code class="language-cpp">std::string result(const char* sample)
{ return std::string(sample); }

int main()
{
    const std::string my_text(result(&quot;123456789&quot;));
}
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">void result(const char* sample, std::string &amp; dest)
{ dest = sample; }

int main()
{
    std::string my_text;
    result(&quot;123456789&quot;, dest);
}
</code></pre>
<p>... da sparst du dir 1x kopieren ... ob du es willst, oder nicht.<br />
okay ich kann dafür my_text nicht const setzen ... <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1455481</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1455481</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Wed, 13 Feb 2008 22:06:21 GMT</pubDate></item><item><title><![CDATA[Reply to boost::array - Semantik on Wed, 13 Feb 2008 22:12:03 GMT]]></title><description><![CDATA[<p>(D)Evil schrieb:</p>
<blockquote>
<p>... da sparst du dir 1x kopieren ...</p>
</blockquote>
<p>wo? Im ersten Fall ist keine Kopie involviert, die nicht nach 12.8/15 eliminiert werden darf (und konsequenterweise von jedem anständigen Compiler eliminiert werden wird).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1455483</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1455483</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 13 Feb 2008 22:12:03 GMT</pubDate></item><item><title><![CDATA[Reply to boost::array - Semantik on Wed, 13 Feb 2008 23:15:55 GMT]]></title><description><![CDATA[<p>Na ja, aber allein um die Objekte in das boost::array hinein zu kopieren wird der Copy-Ctor aufgerufen.</p>
<p>Mein Problem ist, dass die Funktion teil des performance-kritischen Teils meines Programmes ist. In Wirklichkeit schaut das so aus:</p>
<pre><code class="language-cpp">class VectorArraySSE
{
	public:
		// ... ein paar Operatoren

	private:
		boost::array&lt;VectorSSE, 3&gt; v;
};

typedef boost::array&lt;Vector3D, 4&gt; VectorArray3D;
inline VectorArray3D convertToVector3D(const VectorArraySSE&amp; va)
{
	const unsigned int shuffle1 = _MM_SHUFFLE(0, 1, 2, 3);
	const unsigned int shuffle2 = _MM_SHUFFLE(4, 3, 0, 1);
	const VectorSSE x0y0x1y1(_mm_unpacklo_ps(va[0].vec, va[1].vec));
	const VectorSSE x0x1z0z1(_mm_movelh_ps(va[0].vec, va[2].vec));
	const VectorSSE a(_mm_shuffle_ps(x0y0x1y1.vec, x0x1z0z1.vec, shuffle1));
	const VectorSSE b(_mm_shuffle_ps(va[2].vec, x0y0x1y1.vec, shuffle2));

	const unsigned int shuffle3 = _MM_SHUFFLE(3,4, 0, 1);
	const VectorSSE x3y3x4y4(_mm_unpackhi_ps(va[0].vec, va[1].vec));
	const VectorSSE c(_mm_shuffle_ps(x3y3x4y4.vec, va[2].vec, shuffle1));
	const VectorSSE d(_mm_shuffle_ps(va[2].vec, x3y3x4y4.vec, shuffle3));

	VectorArray3D retval = {{Vector3D(a.v[0], a.v[1], a.v[2]),
		Vector3D(b.v[0], b.v[1], b.v[2]),
		Vector3D(c.v[0], c.v[1], c.v[2]),
		Vector3D(d.v[0], d.v[1], d.v[2])}};

	return retval;
}
</code></pre>
<p>Das Ganze ist SSE-Zeugs, und wandelt 3 SSE-Vektoren (Structure of Arrays) in 4 normale 3D-Vektoren (Array of Structures) um.</p>
<p>So wie's momentan ist, hab ich bei jedem Aufruf der Funktion zuerst 4 normale Vector3D-Ctor Aufrufe (zum erstellen der Objekte) und nachher 4 Copy-Ctor Aufrufe, wobei erstere evtl. vom Compiler ja wegoptimiert werden koennten, oder seh ich das falsch?<br />
Wuerde ich das ganze so Umschreiben, wie (D)Evil vorschlaegt (4 Vector3D* als Eingangsparameter), muesste ich trotzdem immer noch 4 Vector3D-Ctors aufrufen, gewinne also gar nix (sondern verliere eher noch was, weil ich die 4 Pointer vorher ja als normale Vector3D initialisieren muss).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1455511</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1455511</guid><dc:creator><![CDATA[Blue-Tiger]]></dc:creator><pubDate>Wed, 13 Feb 2008 23:15:55 GMT</pubDate></item><item><title><![CDATA[Reply to boost::array - Semantik on Thu, 14 Feb 2008 00:37:51 GMT]]></title><description><![CDATA[<p>Blue-Tiger schrieb:</p>
<blockquote>
<p>So wie's momentan ist, hab ich bei jedem Aufruf der Funktion zuerst 4 normale Vector3D-Ctor Aufrufe (zum erstellen der Objekte) und nachher 4 Copy-Ctor Aufrufe, wobei erstere evtl. vom Compiler ja wegoptimiert werden koennten, oder seh ich das falsch?</p>
</blockquote>
<p>Die Copy-ctor-Aufrufe können elimniert werden, nicht die Anderen. Im Übrigen ist dieser Art von Code ohnehin eher ein Spezialfall - allemal sollte deine Vector3D-Klasse über einen Konstruktor verfügen, der direkt mit SSE-Vektoren arbeiten kann. Dann lassen sich einige Variablen einsparen, was durchaus in effizienterem Code resultieren kann. So wie es jetzt aussieht, könntest du auf den SSE-Code auch ganz verzichten, und die Vector3Ds direkt aus den Komponenten von VectorArraySSE konstruieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1455530</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1455530</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 14 Feb 2008 00:37:51 GMT</pubDate></item><item><title><![CDATA[Reply to boost::array - Semantik on Thu, 14 Feb 2008 09:42:22 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Blue-Tiger schrieb:</p>
<blockquote>
<p>So wie's momentan ist, hab ich bei jedem Aufruf der Funktion zuerst 4 normale Vector3D-Ctor Aufrufe (zum erstellen der Objekte) und nachher 4 Copy-Ctor Aufrufe, wobei erstere evtl. vom Compiler ja wegoptimiert werden koennten, oder seh ich das falsch?</p>
</blockquote>
<p>Die Copy-ctor-Aufrufe können elimniert werden, nicht die Anderen. Im Übrigen ist dieser Art von Code ohnehin eher ein Spezialfall - allemal sollte deine Vector3D-Klasse über einen Konstruktor verfügen, der direkt mit SSE-Vektoren arbeiten kann. Dann lassen sich einige Variablen einsparen, was durchaus in effizienterem Code resultieren kann. So wie es jetzt aussieht, könntest du auf den SSE-Code auch ganz verzichten, und die Vector3Ds direkt aus den Komponenten von VectorArraySSE konstruieren.</p>
</blockquote>
<p>Na ja, jeder der 4 Vector3D enthaelt Komponenten aus jedem der VectorSSEs, die im VectorArraySSE gespeichert sind. Wenn ich diese &quot;Zerlegung&quot; in den Vector3D-Ctor verschiebe, muss ich sie 4 mal vornehmen (fuer jeden Vector 1x), das waer eine Vervierfachung der Laufzeit, und der Code ist wie gesagt performancekritisch <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1455657</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1455657</guid><dc:creator><![CDATA[Blue-Tiger]]></dc:creator><pubDate>Thu, 14 Feb 2008 09:42:22 GMT</pubDate></item><item><title><![CDATA[Reply to boost::array - Semantik on Thu, 14 Feb 2008 11:35:42 GMT]]></title><description><![CDATA[<p>Blue-Tiger schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>Blue-Tiger schrieb:</p>
<blockquote>
<p>So wie's momentan ist, hab ich bei jedem Aufruf der Funktion zuerst 4 normale Vector3D-Ctor Aufrufe (zum erstellen der Objekte) und nachher 4 Copy-Ctor Aufrufe, wobei erstere evtl. vom Compiler ja wegoptimiert werden koennten, oder seh ich das falsch?</p>
</blockquote>
<p>Die Copy-ctor-Aufrufe können elimniert werden, nicht die Anderen. Im Übrigen ist dieser Art von Code ohnehin eher ein Spezialfall - allemal sollte deine Vector3D-Klasse über einen Konstruktor verfügen, der direkt mit SSE-Vektoren arbeiten kann. Dann lassen sich einige Variablen einsparen, was durchaus in effizienterem Code resultieren kann. So wie es jetzt aussieht, könntest du auf den SSE-Code auch ganz verzichten, und die Vector3Ds direkt aus den Komponenten von VectorArraySSE konstruieren.</p>
</blockquote>
<p>Na ja, jeder der 4 Vector3D enthaelt Komponenten aus jedem der VectorSSEs, die im VectorArraySSE gespeichert sind. Wenn ich diese &quot;Zerlegung&quot; in den Vector3D-Ctor verschiebe, muss ich sie 4 mal vornehmen (fuer jeden Vector 1x), das waer eine Vervierfachung der Laufzeit, und der Code ist wie gesagt performancekritisch <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>
</blockquote>
<p>Du unternimmst sie doch sowieso 4 mal:</p>
<pre><code class="language-cpp">VectorArray3D retval = {{Vector3D(a.v[0], a.v[1], a.v[2]),
        Vector3D(b.v[0], b.v[1], b.v[2]),
        Vector3D(c.v[0], c.v[1], c.v[2]),
        Vector3D(d.v[0], d.v[1], d.v[2])}};
</code></pre>
<p>wieso ist das nicht</p>
<pre><code class="language-cpp">VectorArray3D retval = {Vector3D(a), Vector3D(b), Vector3D(c), Vector3D(d)}};
</code></pre>
<p>Wenn du wirklich Wert auf Performance legst, sollte Vector3D wahrscheinlich sowieso nur ein Wrapper um VectorSSE sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1455744</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1455744</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 14 Feb 2008 11:35:42 GMT</pubDate></item><item><title><![CDATA[Reply to boost::array - Semantik on Thu, 14 Feb 2008 12:43:14 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Blue-Tiger schrieb:</p>
<blockquote>
<p>Na ja, jeder der 4 Vector3D enthaelt Komponenten aus jedem der VectorSSEs, die im VectorArraySSE gespeichert sind. Wenn ich diese &quot;Zerlegung&quot; in den Vector3D-Ctor verschiebe, muss ich sie 4 mal vornehmen (fuer jeden Vector 1x), das waer eine Vervierfachung der Laufzeit, und der Code ist wie gesagt performancekritisch <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>
</blockquote>
<p>Du unternimmst sie doch sowieso 4 mal:</p>
<pre><code class="language-cpp">VectorArray3D retval = {{Vector3D(a.v[0], a.v[1], a.v[2]),
        Vector3D(b.v[0], b.v[1], b.v[2]),
        Vector3D(c.v[0], c.v[1], c.v[2]),
        Vector3D(d.v[0], d.v[1], d.v[2])}};
</code></pre>
<p>wieso ist das nicht</p>
<pre><code class="language-cpp">VectorArray3D retval = {Vector3D(a), Vector3D(b), Vector3D(c), Vector3D(d)}};
</code></pre>
</blockquote>
<p>Ok, das erspart Tipperei, aber warum koennte ich mir damit Variablen sparen?</p>
<blockquote>
<p>Wenn du wirklich Wert auf Performance legst, sollte Vector3D wahrscheinlich sowieso nur ein Wrapper um VectorSSE sein.</p>
</blockquote>
<p>warum?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1455806</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1455806</guid><dc:creator><![CDATA[Blue-Tiger]]></dc:creator><pubDate>Thu, 14 Feb 2008 12:43:14 GMT</pubDate></item><item><title><![CDATA[Reply to boost::array - Semantik on Thu, 14 Feb 2008 20:17:07 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">inline VectorArray3D convertToVector3D(const VectorArraySSE&amp; va)
{
    __m128 x0x1x2x3 = va[0].vec; // kann man ggf. einsparen, hier erst einmal der Übersichtlichkeit wegen
    __m128 y0y1y2y3 = va[1].vec;
    __m128 z0z1z2z3 = va[2].vec;
    __m128 x0y0x1y1 = _mm_unpacklo_ps( x0x1x2x3, y0y1y2y3 ); // 2
    __m128 x2y2x3y3 = _mm_unpackhi_ps( x0x1x2x3, y0y1y2y3 ); // 2

    VectorArray3D retval = {
        Vector3D( _mm_shuffle_ps( x0y0x1y1, z0z1z2z3, _MM_SHUFFLE( 0, 1, 0, 0 ) ) ), // 2
        Vector3D( _mm_shuffle_ps( x0y0x1y1, z0z1z2z3, _MM_SHUFFLE( 2, 3, 1, 1 ) ) ), // 2
        Vector3D( _mm_shuffle_ps( x2y2x3y3, z0z1z2z3, _MM_SHUFFLE( 0, 1, 2, 2 ) ) ), // 2
        Vector3D( _mm_shuffle_ps( x2y2x3y3, z0z1z2z3, _MM_SHUFFLE( 2, 3, 3, 3 ) ) )  // 2
    };

    return retval;
}
</code></pre>
<p>in Kommentaren jeweils die Mindestanzahl an SSE-Instruktionen, die generiert werden müssten. Das ist regelmäßiger (man erkennt sehr schnell, dass sich etwa die shuffle-Indizes nach einem Muster ändern, und 4 hat dort sowieso nichts zu suchen) und einfacher auf Fehler zu überprüfen (man kann sogar noch etwas einsparen: x0x1y0y1/x2x3y2y3 kann mit weniger Instruktionen generiert werden) . Ist Vector3D kein Wrapper um SSE-Register, dann kann bei der Initialisierung (egal ob nun direkt oder über Komponenten) nur Komponentenweise kopiert werden, dann war die ganze Arbeit per SSE aber völlig überflüssig. Im Übrigen ist das wahrscheinlich ohnehin mit zu feiner Granularität optimiert - die hohe Zahl an hin- und hergeshuffle indiziert, dass man bei einer einzelnen Transformation nicht viel gewinnen wird. So oder so hat das alles eigentlich nichts mit dem urspünglichen Thema zu tun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1456140</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1456140</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 14 Feb 2008 20:17:07 GMT</pubDate></item><item><title><![CDATA[Reply to boost::array - Semantik on Fri, 15 Feb 2008 10:27:38 GMT]]></title><description><![CDATA[<p>Thx fuer die Erklaerungen <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>EDIT: aber warum benoetigt ein _mm_unpackhi_ps 2 Instruktionen?</p>
<p>EDIT2: koenntest du mir nochmal genauer erklaeren, WIE man mit _MM_SHUFFLE angibt, wie geshufflt werden soll? ich glaub ich hab da was falsch verstanden <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 />
(ich erhalte z. B. mit deinem obigen Code komplett falsche Shuffles, ich muss die Reihenfolge der Zahlen im _MM_SHUFFLE Ausdruck umdrehen, um die richtigen zu erhalten)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1456348</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1456348</guid><dc:creator><![CDATA[Blue-Tiger]]></dc:creator><pubDate>Fri, 15 Feb 2008 10:27:38 GMT</pubDate></item></channel></rss>