<?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[unions und der liebe Standard]]></title><description><![CDATA[<p>Hi,</p>
<pre><code class="language-cpp">union V
{
  float data[4];
  struct 
  {
    float x, y, z, w;
  };
};
</code></pre>
<p>Wird hier garantiert, dass die Daten genau übereinanderliegen, also dass x == data[0], ...?<br />
Falls nicht, habt ihr schon mal irgendeinen Compiler gesehen, bei dem das nicht so war?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/292769/unions-und-der-liebe-standard</link><generator>RSS for Node</generator><lastBuildDate>Sun, 16 Aug 2026 17:19:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/292769.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 17 Sep 2011 15:13:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to unions und der liebe Standard on Sat, 17 Sep 2011 15:13:06 GMT]]></title><description><![CDATA[<p>Hi,</p>
<pre><code class="language-cpp">union V
{
  float data[4];
  struct 
  {
    float x, y, z, w;
  };
};
</code></pre>
<p>Wird hier garantiert, dass die Daten genau übereinanderliegen, also dass x == data[0], ...?<br />
Falls nicht, habt ihr schon mal irgendeinen Compiler gesehen, bei dem das nicht so war?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2120469</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2120469</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sat, 17 Sep 2011 15:13:06 GMT</pubDate></item><item><title><![CDATA[Reply to unions und der liebe Standard on Sat, 17 Sep 2011 15:14:51 GMT]]></title><description><![CDATA[<p>Der Standard garantiert dir, dass das was du tun willst, undefiniertes Verhalten ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2120471</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2120471</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sat, 17 Sep 2011 15:14:51 GMT</pubDate></item><item><title><![CDATA[Reply to unions und der liebe Standard on Sat, 17 Sep 2011 15:17:38 GMT]]></title><description><![CDATA[<p>otze schrieb:</p>
<blockquote>
<p>Der Standard garantiert dir, dass das was du tun willst, undefiniertes Verhalten ist.</p>
</blockquote>
<p>So etwas habe ich irgendwie geahnt. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2120473</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2120473</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sat, 17 Sep 2011 15:17:38 GMT</pubDate></item><item><title><![CDATA[Reply to unions und der liebe Standard on Sat, 17 Sep 2011 16:17:13 GMT]]></title><description><![CDATA[<p>es ist so:<br />
wenn du eine union hast und da etwas reinschreibst in ein element, dann ist es legal, auf genau dieses element lesend zuzugreifen. greifst du aber auf ein anderes zu, ist es undefiniert durchd en std</p>
<p>in deinem beispiel wird es wahrscheinlich bei den meisten compilern gutgehen, aber garantiert is nix</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2120505</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2120505</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Sat, 17 Sep 2011 16:17:13 GMT</pubDate></item><item><title><![CDATA[Reply to unions und der liebe Standard on Sat, 17 Sep 2011 16:57:32 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Hi,</p>
<pre><code class="language-cpp">union V
{
  float data[4];
  struct 
  {
    float x, y, z, w;
  };
};
</code></pre>
<p>Wird hier garantiert, dass die Daten genau übereinanderliegen, also dass x == data[0], ...?<br />
Falls nicht, habt ihr schon mal irgendeinen Compiler gesehen, bei dem das nicht so war?</p>
</blockquote>
<p>Zunächst einmal wird dieser Code ill-formed.</p>
<pre><code class="language-cpp">struct 
  {
    float x, y, z, w;
  };
</code></pre>
<p>Der Standard kennt keine anonymen structs.</p>
<pre><code class="language-cpp">union V
{
  float data[4];
  struct data_t
  {
    float x, y, z, w;
  } data_;
};
V foo;
</code></pre>
<p>Der Standard gerantiert hier, dass</p>
<pre><code class="language-cpp">&amp;foo.data[0] == &amp;foo.data_.x
</code></pre>
<p>gilt. Es ist streitig, ob äquivalente Relationen für die folgenden Member auch gelten muss (d.h. ob die Aufzählung der Gründe für Padding in einer Klasse, so wie sie im Standard steht, abschließend ist). Jedenfalls ist es möglich, das Programm so zu formluieren, dass es garantiert ill-formed wird, falls ein Compiler solches zusätzliches Padding benutzt.</p>
<pre><code class="language-cpp">union V
{
  float data[4];
  struct data_t
  {
    float x, y, z, w;
  } data_;
  static_assert(offsetof(data_t, w) == 3*sizeof(float), &quot;unexpected padding in data_t&quot;)
};
V foo;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2120516</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2120516</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 17 Sep 2011 16:57:32 GMT</pubDate></item><item><title><![CDATA[Reply to unions und der liebe Standard on Sat, 17 Sep 2011 17:00:57 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>greifst du aber auf ein anderes zu, ist es undefiniert durchd en std</p>
</blockquote>
<p>Eine Ausnahme ist, wenn die union zwei oder mehr POD-structs beinhaltet und diese eine gemeinsame (d.h. gleiche) Eingans-Sequenz haben. Dann ist es erlaubt, in eines der structs zu schreiben und im anderen diese Eingangs-Sequenz zu lesen:</p>
<pre><code class="language-cpp">struct A {int iA; float fA; short sA; };
struct B {int iB; char[sizeof(float)] cB; short sB; };
union U {A a; B b;};

int main()
{
  A a = {12, 3, 4.5f};
  U u;
  u.a = a;
  int i = u.b.iB; //OK, trotz Zugriff auf B!
  short s = u.b.sB; //ERROR
}
</code></pre>
<p>Das zieht im aktuellen Fall aber nicht, weil ein struct mit einem array unioniert (?) werden soll. Aus den ganzen Absätzen zur object representation und zur layout compatibility könnte man evtl. noch lesen, dass das jeweils erste float an der gleichen Stelle im Speicher liegen müssen, und dass es ja ein POD-union ist und man deshalb da vielleicht in irgendeiner Grauzone, noch nicht ganz im UB sitzt. Für die anderen floats kanns aber ziemlich daneben gehen, weil nirgendwo steht, dass der Compiler in das struct kein Padding einbauen darf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2120518</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2120518</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Sat, 17 Sep 2011 17:00:57 GMT</pubDate></item><item><title><![CDATA[Reply to unions und der liebe Standard on Sat, 17 Sep 2011 17:46:01 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a>, pumuckl<br />
Danke, hat mir sehr geholfen. Werde also versuchen es zu umgehen und sonst static_assert nehmen.</p>
<p>(Ich habe diese Methode mittlerweile nur so oft gesehen, dass ich die Hoffnung hatte, dass es vielleicht doch garantiert wird.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2120521</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2120521</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sat, 17 Sep 2011 17:46:01 GMT</pubDate></item></channel></rss>