<?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[field initializer is not constant]]></title><description><![CDATA[<pre><code>#include &lt;immintrin.h&gt;

struct Test
{
    static constexpr  __m128i memberVar = _mm_set1_epi16(12);
};

int main()
{
    return 0;
}
{
</code></pre>
<p>Bei meiner memberVar beschwert sich g++: &quot;error field initializer is not constant&quot;. Mit einfach Datentypen (int,.. ) funktioniert es. Wie kriege ich das mit __m128i hin?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/332339/field-initializer-is-not-constant</link><generator>RSS for Node</generator><lastBuildDate>Tue, 28 Apr 2026 03:50:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/332339.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 22 Apr 2015 22:13:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to field initializer is not constant on Wed, 22 Apr 2015 22:13:36 GMT]]></title><description><![CDATA[<pre><code>#include &lt;immintrin.h&gt;

struct Test
{
    static constexpr  __m128i memberVar = _mm_set1_epi16(12);
};

int main()
{
    return 0;
}
{
</code></pre>
<p>Bei meiner memberVar beschwert sich g++: &quot;error field initializer is not constant&quot;. Mit einfach Datentypen (int,.. ) funktioniert es. Wie kriege ich das mit __m128i hin?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2451285</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2451285</guid><dc:creator><![CDATA[itsamee]]></dc:creator><pubDate>Wed, 22 Apr 2015 22:13:36 GMT</pubDate></item><item><title><![CDATA[Reply to field initializer is not constant on Thu, 23 Apr 2015 06:12:04 GMT]]></title><description><![CDATA[<p>Ich würde mal vermuten. das die Funktion _mm_set1_epi16 nicht constexpr ist. Was ist überhaupt ein __m128i?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2451295</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2451295</guid><dc:creator><![CDATA[TNA]]></dc:creator><pubDate>Thu, 23 Apr 2015 06:12:04 GMT</pubDate></item><item><title><![CDATA[Reply to field initializer is not constant on Thu, 23 Apr 2015 09:07:30 GMT]]></title><description><![CDATA[<p>Ein Vektorregister (MMX &amp; Co.) mit insgesamt 128 Bit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2451316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2451316</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 23 Apr 2015 09:07:30 GMT</pubDate></item><item><title><![CDATA[Reply to field initializer is not constant on Thu, 23 Apr 2015 10:20:11 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Ein Vektorregister (MMX &amp; Co.) mit insgesamt 128 Bit.</p>
</blockquote>
<p>Wenn das Compiler-Intrinsic ist, ist natürlich schwer zu beantworten. Da müsste man in die Compiler-Doku schauen. Hast du mal versucht, einen constexpr __m128i mit einer Konstanten zu initialisieren? Versuch das mal um den Fehler weiter einzugrenzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2451328</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2451328</guid><dc:creator><![CDATA[TNA]]></dc:creator><pubDate>Thu, 23 Apr 2015 10:20:11 GMT</pubDate></item><item><title><![CDATA[Reply to field initializer is not constant on Thu, 23 Apr 2015 18:05:24 GMT]]></title><description><![CDATA[<p>Die SIMD-Typen wie __m128i sind soweit ich weiss Compiler-spezifische typedefs, wie z.B. <code>typedef long long __m128i __attribute__ ((__vector_size__ (16), __may_alias__))</code> in GCC oder<br />
<code>typedef union __declspec(intrin_type) __declspec(align(16)) {char c[16];} __m128i</code> in Visual C.<br />
Wenn du diese statisch als <em>constexpr</em> initialisieren möchtest, wirst du diese Variablen wohl mit einem Ausdruck initialisieren müssen, der für den entsprechenden Compiler passt, also z.B. <code>{ 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12 }</code> in Visual C.<br />
Das ist allerdings nicht sehr portabel und nicht gerade bequem wenn man wie du 16bit-Integer in die SIMD-Variable schrieben möchte.</p>
<p>Ich würde daher eher so etwas hier vorschlagen:</p>
<pre><code>struct Test
{
    alignas(16) static constexpr std::int16_t memberVar[8] = { 12, 12, 12, 12, 12, 12, 12, 12 };
};

alignas(16) constexpr std::int16_t Test::memberVar[8];
</code></pre>
<p>Damit machst du dann alles zur Compile-Zeit weswegen du überhaupt in erster Linie die <em>constexpr</em> benötigst. Sobald du dann anfängst mit den Werten tatsächlich in einem SIMD-Register zu rechnen, lädst diese dann aus dem Speicher:</p>
<pre><code>__m128i r1 = _mm_load_si128(reinterpret_cast&lt;const __m128i*&gt;(Test::memberVar));
</code></pre>
<p>ich weiss nicht ob das das eleganteste Weg ist, aber diesen würde ich persönlich einschlagen, wenn die Werte, mit denen die SIMD-Variablen initialisiert werden, undbedingt ein <em>constexpr</em>-Ausruck sein müssen.</p>
<p>Gruss,<br />
Finnegan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2451392</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2451392</guid><dc:creator><![CDATA[Finnegan]]></dc:creator><pubDate>Thu, 23 Apr 2015 18:05:24 GMT</pubDate></item></channel></rss>