<?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[Sind Member linear in struct&#x2F;Klasse?]]></title><description><![CDATA[<p>Hallo,</p>
<p>sagen wir ich habe so eine struct:</p>
<pre><code class="language-cpp">struct Foo {
   float r,g,b,a;

   float* asArray() { return &amp;r; }
};
</code></pre>
<p>Ist dann garantiert, dass die Membervariablen linear im Speicher liegen? Sprich: Wird die Methode asArray() absolut immer funktionieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/246621/sind-member-linear-in-struct-klasse</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 00:16:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/246621.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 30 Jul 2009 13:51:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Sind Member linear in struct&#x2F;Klasse? on Thu, 30 Jul 2009 13:51:28 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>sagen wir ich habe so eine struct:</p>
<pre><code class="language-cpp">struct Foo {
   float r,g,b,a;

   float* asArray() { return &amp;r; }
};
</code></pre>
<p>Ist dann garantiert, dass die Membervariablen linear im Speicher liegen? Sprich: Wird die Methode asArray() absolut immer funktionieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1752394</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1752394</guid><dc:creator><![CDATA[bayernVSManUvorfreuer]]></dc:creator><pubDate>Thu, 30 Jul 2009 13:51:28 GMT</pubDate></item><item><title><![CDATA[Reply to Sind Member linear in struct&#x2F;Klasse? on Thu, 30 Jul 2009 13:56:34 GMT]]></title><description><![CDATA[<p>bayernVSManUvorfreuer schrieb:</p>
<blockquote>
<p>Hallo,<br />
sagen wir ich habe so eine struct:</p>
<pre><code class="language-cpp">struct Foo {
   float r,g,b,a;

   float* asArray() { return &amp;r; }
};
</code></pre>
<p>Ist dann garantiert, dass die Membervariablen linear im Speicher liegen? Sprich: Wird die Methode asArray() absolut immer funktionieren?</p>
</blockquote>
<p>Nach Standard: Nein.<br />
Nach normalem Ermessen: Ja.<br />
Ich würde es (wenn nur ums geh/gehtnicht geht) machen und mit ausreichen static_assert absichern. Ob ich's in Sachen Wenigfrickelndem Stil vertreten könnte, ist was anderes.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1752402</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1752402</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 30 Jul 2009 13:56:34 GMT</pubDate></item><item><title><![CDATA[Reply to Sind Member linear in struct&#x2F;Klasse? on Thu, 30 Jul 2009 14:00:33 GMT]]></title><description><![CDATA[<p>Wenn du die Member als Array ansprechen willst, dann nimm doch ein Array... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1752407</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1752407</guid><dc:creator><![CDATA[&#x27;]]></dc:creator><pubDate>Thu, 30 Jul 2009 14:00:33 GMT</pubDate></item><item><title><![CDATA[Reply to Sind Member linear in struct&#x2F;Klasse? on Thu, 30 Jul 2009 14:03:01 GMT]]></title><description><![CDATA[<p>Ich habs jetzt so gemacht:</p>
<pre><code class="language-cpp">class Color {
public:
   union {
      struct { float	r, g, b, a; };
      float channel[4];	
   };
};
</code></pre>
<p>Passt das, oder kann das schief gehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1752411</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1752411</guid><dc:creator><![CDATA[bayernVSManUvorfreuer]]></dc:creator><pubDate>Thu, 30 Jul 2009 14:03:01 GMT</pubDate></item><item><title><![CDATA[Reply to Sind Member linear in struct&#x2F;Klasse? on Thu, 30 Jul 2009 14:04:51 GMT]]></title><description><![CDATA[<p>Das gleiche Problem. Hast du meinen Post gelesen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1752412</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1752412</guid><dc:creator><![CDATA[&#x27;]]></dc:creator><pubDate>Thu, 30 Jul 2009 14:04:51 GMT</pubDate></item><item><title><![CDATA[Reply to Sind Member linear in struct&#x2F;Klasse? on Thu, 30 Jul 2009 14:09:15 GMT]]></title><description><![CDATA[<p>also im Normalfall liegen die Member einer Klasse/Struktur in der Reihenfolge hintereinander, wie man sie im Quelltext angegeben hat.<br />
von daher sollte dein Ansatz funktionieren.</p>
<p>allerdings solltest du auf das Alignment achten.</p>
<p>der Compiler neigt dazu Platzhalter in Strukturen/Klassen einzufügen (kA warum)<br />
jedenfalls lässt sich das Alignment einstellen.</p>
<p>schau mal hier zum Thema alignment:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-117530-and-view-is-previous.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-117530-and-view-is-previous.html</a></p>
<p>also die VC++ Lösung:</p>
<pre><code class="language-cpp">#pragma pack(push, 1) // Alignment von 1 (praktisch kein alignment)
struct Foo
{
    float r, g, b, a;
    float* asArray(void) { return &amp;r; }
};
#pragma pack(pop) // Default alignment
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1752414</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1752414</guid><dc:creator><![CDATA[DrakoXP]]></dc:creator><pubDate>Thu, 30 Jul 2009 14:09:15 GMT</pubDate></item><item><title><![CDATA[Reply to Sind Member linear in struct&#x2F;Klasse? on Thu, 30 Jul 2009 14:08:40 GMT]]></title><description><![CDATA[<p>DrakoXP schrieb:</p>
<blockquote>
<p>der Compiler neigt dazu Platzhalter in Strukturen/Klassen einzufügen (kA warum)</p>
</blockquote>
<p>Performance (einfachere Berechnung des Offsets). Bei gleichen Membergrössen sollte Alignment eigentlich nicht auftreten, aber es ist halt nicht verboten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1752415</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1752415</guid><dc:creator><![CDATA[&#x27;]]></dc:creator><pubDate>Thu, 30 Jul 2009 14:08:40 GMT</pubDate></item><item><title><![CDATA[Reply to Sind Member linear in struct&#x2F;Klasse? on Thu, 30 Jul 2009 14:15:13 GMT]]></title><description><![CDATA[<p>Dann hab ich aber in diesem Code:</p>
<pre><code class="language-cpp">class Color { 
public: 
   union { 
      struct { float    r, g, b, a; }; 
      float channel[4];    
   }; 
};
</code></pre>
<p>Auch das Problem mit Alignment, oder? Wenn das Alignment jetzt größer als 4 ist, dann werden nach jedem float in der Struct Füllbytes eingefügt und die Werte im Array channel korrespondieren dann nicht mehr mit den r,g,b,a werten (zB. ist &amp;channel[1] nicht mehr gleich &amp;g), oder?</p>
<p>PS: Hab gerade geschaut, in meinem VS08 ist &quot;struct member alignment&quot; auf default gestellt. Was genau bedeutet das? Dass der Compiler es selber nach Belieben für jede struct entscheiden kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1752422</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1752422</guid><dc:creator><![CDATA[bayernVSManUvorfreuer]]></dc:creator><pubDate>Thu, 30 Jul 2009 14:15:13 GMT</pubDate></item><item><title><![CDATA[Reply to Sind Member linear in struct&#x2F;Klasse? on Thu, 30 Jul 2009 14:22:50 GMT]]></title><description><![CDATA[<p>warum das union? warum überhaupt die r,g,b,a und nicht das Array, wie ' schon vorgeschlagen hatte?<br />
Wenns denn wirklich sein muss mach dir noch methoden dazu die dir ne referenz auf das jeweilige arrayelement liefern:</p>
<pre><code class="language-cpp">class Color {
private: 
  float channel[4];
public: 
  float* asArray() { return channel; }
  float&amp; r() { return channel[0]; }
  float&amp; g() { return channel[1]; }
  // usw.
};
</code></pre>
<p>Alles andere ist nicht portabel (auch die #pagmas nicht, die werden auf anderen Compilern ggf. einfach ignoriert)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1752427</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1752427</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 30 Jul 2009 14:22:50 GMT</pubDate></item><item><title><![CDATA[Reply to Sind Member linear in struct&#x2F;Klasse? on Thu, 30 Jul 2009 15:09:53 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>warum das union? warum überhaupt die r,g,b,a und nicht das Array, wie ' schon vorgeschlagen hatte?</p>
</blockquote>
<p>Weil ich sehr, sehr häufig eben Zugriff auf rgba brauche. Und ich habe weder Lust ständig zu schreiben color.colors[2] + color.colors[3] + ... noch<br />
colors.r() + colors.g() + ...<br />
Portabilität ist mir auch völlig egal. Zielplattform ist ausschließlich Windows.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1752463</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1752463</guid><dc:creator><![CDATA[bayernVSManUvorfreuer]]></dc:creator><pubDate>Thu, 30 Jul 2009 15:09:53 GMT</pubDate></item><item><title><![CDATA[Reply to Sind Member linear in struct&#x2F;Klasse? on Thu, 30 Jul 2009 15:52:12 GMT]]></title><description><![CDATA[<p>unions haben durchaus ihre Daseinsberechtigung.</p>
<p>Alignment ist normalerweise auch kein Problem.<br />
Es wird immer das alignment des größten Members genommen.<br />
Nur wenn du in deiner struct unterschiedlich große Typen hättest,<br />
würds vielleicht interessant werden, aber wahrscheinlich nichtmal dann.</p>
<p>Ausserdem sind unions ein Überbleibsel aus C und deshalb<br />
imo portabler als Klassen.</p>
<p>Mein DSP C compiler kann das auch.</p>
<p>EDIT: Portabilität zu 64bit würd mich interessieren,<br />
aber wird dann nicht auch einfach die selbe alignment strategie<br />
(kleinstmögliches aber größtes erwartetes)<br />
angewandt und es kommt das selbe heraus?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1752478</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1752478</guid><dc:creator><![CDATA[krxlprnft]]></dc:creator><pubDate>Thu, 30 Jul 2009 15:52:12 GMT</pubDate></item><item><title><![CDATA[Reply to Sind Member linear in struct&#x2F;Klasse? on Thu, 30 Jul 2009 15:37:59 GMT]]></title><description><![CDATA[<p>Hab ein paar Tests gemacht und es scheint alles zu klappen. Passt <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1752480</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1752480</guid><dc:creator><![CDATA[bayernVSManUvorfreuer]]></dc:creator><pubDate>Thu, 30 Jul 2009 15:37:59 GMT</pubDate></item><item><title><![CDATA[Reply to Sind Member linear in struct&#x2F;Klasse? on Thu, 30 Jul 2009 17:10:21 GMT]]></title><description><![CDATA[<p>DrakoXP schrieb:</p>
<blockquote>
<p>also im Normalfall liegen die Member einer Klasse/Struktur in der Reihenfolge hintereinander, wie man sie im Quelltext angegeben hat.</p>
</blockquote>
<p>Was heißt denn &quot;im Normalfall&quot;? Ich zitiere nur mal eine boost-Dokumentation:</p>
<p>&lt;a href= schrieb:</p>
<blockquote>
<p><a href="http://www.boost.org/doc/libs/1_39_0/libs/bimap/doc/html/boost_bimap/rationale.html#boost_bimap.rationale.general_design" rel="nofollow">http://www.boost.org/doc/libs/1_39_0/libs/bimap/doc/html/boost_bimap/rationale.html#boost_bimap.rationale.general_design</a>&quot;&gt;<br />
In order to use this, the compiler must conform to a layout-compatibility clause that is not currently in the standard but is very natural. The additional clause imposes that if we have two classes:</p>
<pre><code class="language-cpp">struct class_a_b
{
    Type1 name_a;
    Type2 name_b;
};

struct class_b_a
{
    Type1 name_b;
    Type2 name_a;
};
</code></pre>
<p>then the storage layout of class_a_b is equal to the storage layout of class_b_a. If you are surprised to learn that this does not hold in a standards-compliant C++ compiler, welcome to the club.</p>
</blockquote>
<p>Felix</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1752535</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1752535</guid><dc:creator><![CDATA[Phoemuex]]></dc:creator><pubDate>Thu, 30 Jul 2009 17:10:21 GMT</pubDate></item><item><title><![CDATA[Reply to Sind Member linear in struct&#x2F;Klasse? on Thu, 30 Jul 2009 20:54:34 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>bayernVSManUvorfreuer schrieb:</p>
<blockquote>
<p>Hallo,<br />
sagen wir ich habe so eine struct:</p>
<pre><code class="language-cpp">struct Foo {
   float r,g,b,a;

   float* asArray() { return &amp;r; }
};
</code></pre>
<p>Ist dann garantiert, dass die Membervariablen linear im Speicher liegen? Sprich: Wird die Methode asArray() absolut immer funktionieren?</p>
</blockquote>
<p>Nach Standard: Nein.<br />
Nach normalem Ermessen: Ja.<br />
Ich würde es (wenn nur ums geh/gehtnicht geht) machen und mit ausreichen static_assert absichern. Ob ich's in Sachen Wenigfrickelndem Stil vertreten könnte, ist was anderes.</p>
</blockquote>
<p>Nachdem Foo hier ein POD ist, sagt der Standard da irgendwas vonwegen &quot;compatible layout&quot;. Also gleich wie in C, wenn ich das richtig verstehe. Und in C ist es <em>glaube ich</em> garantiert. D.h. im Falle von PODs auch in C++. <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="🙂"
    /><br />
(EDIT: WENN ich mich mit keiner dieser &quot;Annahmen&quot; irre, muss das heissen /EDIT)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1752627</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1752627</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 30 Jul 2009 20:54:34 GMT</pubDate></item></channel></rss>