<?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[Union für mehr performance ?]]></title><description><![CDATA[<p>Hallo Leute !</p>
<p>Ich habe folgende Idee und würde gerne mal wissen ob<br />
das möglich und ok ist oder eher ein hack den man<br />
nicht machen sollte.</p>
<p>Ich habe 4 bool variablen und möchte :<br />
1. jede einzelne auf true/false testen können<br />
2. mit nur einem &quot;Zugriff&quot; testen können ob alle false sind</p>
<p>Um das zu ermöglichen dachte ich mir verwende ich unio wie folgt :</p>
<pre><code class="language-cpp">struct BoolBundle
{
  bool A;
  bool B;
  bool C;
  bool D;
};

union {
  unsigned int ZeroIfAllFalse;
  BoolBundle   Boolean;
};
</code></pre>
<p>4x 1Byte große bool Variablen teilen sich also den gleichen Speicher mit<br />
1x 4Byte großer unsigned int Variable. Sind alle A,B,C,D false, dann ist<br />
auch ZeroIfAllFalse==0, richtig ?</p>
<p>Somit könnte ich ganz einfach mit<br />
if (ZeroIfAllFalse==0) prüfen ob alle false sind.</p>
<p>Ich müßte blos prüfen ob unsigned int immer genauso groß ist<br />
wie 4 bytes (was auf 32bit systemen ja der Fall ist). <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="😃"
    /></p>
<p>Was haltet Ihr davon, ist es unsinnig sowas zu machen weil<br />
es eher ein hack ist und vielleicht es doch irgendwie probleme<br />
geben könnte oder könnte ich das einfach so machen wenn ich<br />
vor dem Programmstart noch teste ob<br />
sizeof(unsigned int) == 4*sizeof(byte) ist ? <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>Freu mich über Eure Meinungen, es müßte doch auf jedenfall schneller<br />
sein als wenn ich statt <strong>(ZeroIfAllFalse==0)</strong> prüfen müßte ob<br />
<strong>!(A || B || C || D)</strong> oder ?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/158563/union-für-mehr-performance</link><generator>RSS for Node</generator><lastBuildDate>Thu, 10 Sep 2026 03:38:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/158563.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 06 Sep 2006 14:29:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Union für mehr performance ? on Wed, 06 Sep 2006 14:29:18 GMT]]></title><description><![CDATA[<p>Hallo Leute !</p>
<p>Ich habe folgende Idee und würde gerne mal wissen ob<br />
das möglich und ok ist oder eher ein hack den man<br />
nicht machen sollte.</p>
<p>Ich habe 4 bool variablen und möchte :<br />
1. jede einzelne auf true/false testen können<br />
2. mit nur einem &quot;Zugriff&quot; testen können ob alle false sind</p>
<p>Um das zu ermöglichen dachte ich mir verwende ich unio wie folgt :</p>
<pre><code class="language-cpp">struct BoolBundle
{
  bool A;
  bool B;
  bool C;
  bool D;
};

union {
  unsigned int ZeroIfAllFalse;
  BoolBundle   Boolean;
};
</code></pre>
<p>4x 1Byte große bool Variablen teilen sich also den gleichen Speicher mit<br />
1x 4Byte großer unsigned int Variable. Sind alle A,B,C,D false, dann ist<br />
auch ZeroIfAllFalse==0, richtig ?</p>
<p>Somit könnte ich ganz einfach mit<br />
if (ZeroIfAllFalse==0) prüfen ob alle false sind.</p>
<p>Ich müßte blos prüfen ob unsigned int immer genauso groß ist<br />
wie 4 bytes (was auf 32bit systemen ja der Fall ist). <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="😃"
    /></p>
<p>Was haltet Ihr davon, ist es unsinnig sowas zu machen weil<br />
es eher ein hack ist und vielleicht es doch irgendwie probleme<br />
geben könnte oder könnte ich das einfach so machen wenn ich<br />
vor dem Programmstart noch teste ob<br />
sizeof(unsigned int) == 4*sizeof(byte) ist ? <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>Freu mich über Eure Meinungen, es müßte doch auf jedenfall schneller<br />
sein als wenn ich statt <strong>(ZeroIfAllFalse==0)</strong> prüfen müßte ob<br />
<strong>!(A || B || C || D)</strong> oder ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1132375</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1132375</guid><dc:creator><![CDATA[Schnulla]]></dc:creator><pubDate>Wed, 06 Sep 2006 14:29:18 GMT</pubDate></item><item><title><![CDATA[Reply to Union für mehr performance ? on Wed, 06 Sep 2006 14:40:33 GMT]]></title><description><![CDATA[<p>ich würd's vielleicht eher so machen:</p>
<pre><code>bool bool_bundle[4];
unsigned int *all_bools = (unsigned int*)bool_bundle;
...
  if (*all_bools == 0)
  {
      // alle sind false
  }
...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1132391</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1132391</guid><dc:creator><![CDATA[net 0]]></dc:creator><pubDate>Wed, 06 Sep 2006 14:40:33 GMT</pubDate></item><item><title><![CDATA[Reply to Union für mehr performance ? on Wed, 06 Sep 2006 14:47:22 GMT]]></title><description><![CDATA[<p>ja auch eine Möglichkeit, aber ist die nicht <strong>etwas</strong><br />
langsamer weil da noch derefernziert wird ? <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="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1132397</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1132397</guid><dc:creator><![CDATA[Schnulla]]></dc:creator><pubDate>Wed, 06 Sep 2006 14:47:22 GMT</pubDate></item><item><title><![CDATA[Reply to Union für mehr performance ? on Wed, 06 Sep 2006 14:48:47 GMT]]></title><description><![CDATA[<p>dereferenziert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1132401</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1132401</guid><dc:creator><![CDATA[Schnulla]]></dc:creator><pubDate>Wed, 06 Sep 2006 14:48:47 GMT</pubDate></item><item><title><![CDATA[Reply to Union für mehr performance ? on Wed, 06 Sep 2006 15:03:28 GMT]]></title><description><![CDATA[<p>dann vielleicht so</p>
<pre><code>...
#define ALL_BOOLS *(unsigned int*)bool_bundle
...
if (ALL_BOOLS == 0)
{
   // alle bools false
}
...
</code></pre>
<p>dabei wird zwar auch dereferenziert aber es ist kein umweg über 'ne pointervariable d.h. kann besser optimiert werden.</p>
<p>zu der struct/union konstruktion hätt' ich weniger vertrauen wegen alignment und sowas....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1132416</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1132416</guid><dc:creator><![CDATA[net 0]]></dc:creator><pubDate>Wed, 06 Sep 2006 15:03:28 GMT</pubDate></item><item><title><![CDATA[Reply to Union für mehr performance ? on Wed, 06 Sep 2006 15:17:01 GMT]]></title><description><![CDATA[<p>Stimmt ich glaub ich mach das lieber so wie Du schreibst,<br />
das mit dem Alignment ist wirklich noch ne kleine Gefahr.</p>
<p>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/1132429</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1132429</guid><dc:creator><![CDATA[Schnulla]]></dc:creator><pubDate>Wed, 06 Sep 2006 15:17:01 GMT</pubDate></item><item><title><![CDATA[Reply to Union für mehr performance ? on Wed, 06 Sep 2006 15:20:19 GMT]]></title><description><![CDATA[<p>Achso, aber wenn ich einzeln auf die bools zugreifen will,<br />
ist dann z.B. das</p>
<pre><code class="language-cpp">if (bool_bundle[2])
{
  // do something beautiful
}
</code></pre>
<p>auch wirklich nicht langsamer als ein<br />
struct Zugriff auf das union wie</p>
<pre><code class="language-cpp">if (Boolean.B)
{
  // do something beautiful
}
</code></pre>
<p>? Weiß leider nicht was der Compiler da anstellt ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1132436</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1132436</guid><dc:creator><![CDATA[Schnulla]]></dc:creator><pubDate>Wed, 06 Sep 2006 15:20:19 GMT</pubDate></item><item><title><![CDATA[Reply to Union für mehr performance ? on Wed, 06 Sep 2006 15:28:13 GMT]]></title><description><![CDATA[<p>Schnulla schrieb:</p>
<blockquote>
<p>Achso, aber wenn ich einzeln auf die bools zugreifen will,<br />
ist dann z.B. das</p>
<pre><code class="language-cpp">if (bool_bundle[2])
{
  // do something beautiful
}
</code></pre>
<p>auch wirklich nicht langsamer als ein<br />
struct Zugriff auf das union wie</p>
<pre><code class="language-cpp">if (Boolean.B)
{
  // do something beautiful
}
</code></pre>
<p>? Weiß leider nicht was der Compiler da anstellt ?</p>
</blockquote>
<p>ich denke darum musste dir keine sorgen machen.<br />
wenn der index ein fester wert ist, wird im ausführbaren code sehr wahrscheinlich keine berechnung 'array+index' o.ä. mehr vorkommen.<br />
ausser du schaltest alle optimierungen aus, aber selbst dann wohl nicht.<br />
probier's doch einfach mal aus und schau dir das disassembly an...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1132445</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1132445</guid><dc:creator><![CDATA[net 0]]></dc:creator><pubDate>Wed, 06 Sep 2006 15:28:13 GMT</pubDate></item><item><title><![CDATA[Reply to Union für mehr performance ? on Wed, 06 Sep 2006 15:39:04 GMT]]></title><description><![CDATA[<blockquote>
<p>if (!bool_bundle[3])<br />
005175CE movzx eax,byte ptr [ebp-11h]<br />
005175D2 test eax,eax<br />
005175D4 jne 00517611<br />
{</p>
</blockquote>
<p>macht er draus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1132456</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1132456</guid><dc:creator><![CDATA[Schnulla]]></dc:creator><pubDate>Wed, 06 Sep 2006 15:39:04 GMT</pubDate></item><item><title><![CDATA[Reply to Union für mehr performance ? on Wed, 06 Sep 2006 15:54:34 GMT]]></title><description><![CDATA[<p>Also schön flotter Zugriff genauso wie auf eine einzeln<br />
deklarierte bool variable <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="🙂"
    /> Cool dann mach ich das so,<br />
also danke nochmal ! <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="👍"
    /><br />
cu</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1132470</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1132470</guid><dc:creator><![CDATA[Schnulla]]></dc:creator><pubDate>Wed, 06 Sep 2006 15:54:34 GMT</pubDate></item></channel></rss>