<?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[struct alignment]]></title><description><![CDATA[<p>Hallo!</p>
<p>Garantiert mir der Standard, dass in einem Struct, welches ausschließlich char member und char array members besitzt, alle wirklich hintereinander im speicher liegen oder kann da auch irgendein alignment dazwischenpfuschen?</p>
<pre><code class="language-cpp">struct Foo
{
    char bar1;
    char bar[2];
}
</code></pre>
<p>Vermutl. findet am Schluss zusätzlich irgendeine Form von Padding statt?</p>
<p>Grüße</p>
<p>PS: Kontext: Schreiben/lesen einer Binärdatei</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/292265/struct-alignment</link><generator>RSS for Node</generator><lastBuildDate>Mon, 17 Aug 2026 03:38:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/292265.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 06 Sep 2011 07:39:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to struct alignment on Tue, 06 Sep 2011 08:04:16 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Garantiert mir der Standard, dass in einem Struct, welches ausschließlich char member und char array members besitzt, alle wirklich hintereinander im speicher liegen oder kann da auch irgendein alignment dazwischenpfuschen?</p>
<pre><code class="language-cpp">struct Foo
{
    char bar1;
    char bar[2];
}
</code></pre>
<p>Vermutl. findet am Schluss zusätzlich irgendeine Form von Padding statt?</p>
<p>Grüße</p>
<p>PS: Kontext: Schreiben/lesen einer Binärdatei</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115547</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115547</guid><dc:creator><![CDATA[berndbernd]]></dc:creator><pubDate>Tue, 06 Sep 2011 08:04:16 GMT</pubDate></item><item><title><![CDATA[Reply to struct alignment on Tue, 06 Sep 2011 07:52:07 GMT]]></title><description><![CDATA[<p>Diese Frage hat meist Faulheit als Hintergrund. Warum machst du dich nicht gleich unabhaengig von Padding? Auch kannst du leicht mittels <code>sizeof</code> pruefen, ob Padding oder nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115554</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115554</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 06 Sep 2011 07:52:07 GMT</pubDate></item><item><title><![CDATA[Reply to struct alignment on Tue, 06 Sep 2011 08:03:31 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>Diese Frage hat meist Faulheit als Hintergrund.</p>
</blockquote>
<p>Nö, der Hintergrund ist bessere Code-Les- und Wartbarkeit. (Aber natürlich nur, wenn das Vorgehen laut Standard OK sein sollte.)</p>
<p>knivil schrieb:</p>
<blockquote>
<p>Warum machst du dich nicht gleich unabhaengig von Padding? Auch kannst du leicht mittels <code>sizeof</code> pruefen, ob Padding oder nicht.</p>
</blockquote>
<p>Das ist mir schon klar. Mir gehts in erster Linie ja auch um das alignment innerhalb des structs.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115565</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115565</guid><dc:creator><![CDATA[berndbernd]]></dc:creator><pubDate>Tue, 06 Sep 2011 08:03:31 GMT</pubDate></item><item><title><![CDATA[Reply to struct alignment on Tue, 06 Sep 2011 08:18:18 GMT]]></title><description><![CDATA[<p>berndbernd schrieb:</p>
<blockquote>
<p>PS: Kontext: Schreiben/lesen einer Binärdatei</p>
</blockquote>
<p>So als Tip: Lesen und schreiben von strukturierten Daten implementiert man am Besten elementweise. Dann hat man solche Probleme nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115568</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115568</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Tue, 06 Sep 2011 08:18:18 GMT</pubDate></item><item><title><![CDATA[Reply to struct alignment on Tue, 06 Sep 2011 08:17:57 GMT]]></title><description><![CDATA[<p>Da der Standard keine Ausnahmen für chars macht (Wieso sollte er? Stell dir mal struct{char[3]; char[3]; char[3]; char[3]}; vor, da möchte ich doch Padding erwarten!) ist egal was deine Motive sind. Das Vorgehen ist ohnehin nicht durch den Standard gedeckt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115569</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115569</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 06 Sep 2011 08:17:57 GMT</pubDate></item><item><title><![CDATA[Reply to struct alignment on Tue, 06 Sep 2011 08:33:59 GMT]]></title><description><![CDATA[<p>berndbernd schrieb:</p>
<blockquote>
<p>Hallo!</p>
<p>Garantiert mir der Standard, dass in einem Struct, welches ausschließlich char member und char array members besitzt, alle wirklich hintereinander im speicher liegen oder kann da auch irgendein alignment dazwischenpfuschen?</p>
<pre><code class="language-cpp">struct Foo
{
    char bar1;
    char bar[2];
}
</code></pre>
<p>Vermutl. findet am Schluss zusätzlich irgendeine Form von Padding statt?</p>
<p>Grüße</p>
<p>PS: Kontext: Schreiben/lesen einer Binärdatei</p>
</blockquote>
<p>Für C++98 wird hier wahrscheinlich nichts garantiert.<br />
Mit C++11 kann man die Frage anders formulieren:</p>
<pre><code class="language-cpp">struct Foo { char bar1; char bar[2]; };
struct Foo2 { char bar[3]; };
</code></pre>
<p>Sind Foo und Foo2 layout-kompatibel?<br />
Leider findet sich keine explizite Aussage zu Arrays. Wir wissen zwar genau, wie ein Array aufgebaut ist, unklar bleibt aber, ob wir dieses Wissen bei Klassen anwenden können.</p>
<blockquote>
<p>3.9/11<br />
If two types T1 and T2 are the same type, then T1 and T2 are layout-compatible types. [ Note: Layoutcompatible enumerations are described in 7.2. Layout-compatible standard-layout structs and standardlayout<br />
unions are described in 9.2. —end note ]</p>
<p>9.2/17<br />
Two standard-layout struct (Clause 9) types are layout-compatible if they have the same number of non-static data members and corresponding non-static data members (in declaration order) have layout-compatible types (3.9).</p>
</blockquote>
<p>Die Frage ist hier, ob mit &quot;corresponding non-static data members&quot; auch ganze Arrays gemeint sind, oder ob vielmehr auf die einzelnen Elemente des Arrays abgestellt wird.</p>
<blockquote>
<p>9/11<br />
Nonstatic data members of a (non-union) class with the same access control (Clause 11) are allocated so that later members have higher addresses within a class object. The order of allocation of non-static data members with different access control is unspecified (11). Implementation alignment requirements might cause two adjacent members not to be allocated immediately after each other; so might requirements for space for managing virtual functions (10.3) and virtual base classes (10.1).</p>
</blockquote>
<p>Diese Aufzählung scheint vollständig zu sein: Standardlayout-Klassen haben keine virtuellen Funktionen oder Basen, und zischen zwei aufeinander folgenden chars ist niemals padding erforderlich, um korrektes Alignment herzustellen. Ich tendiere deshalb dazu, dass der neue Standard ausreichende Garantien gibt. Allerdings lässt die Formulierung durchaus Spielraum für andere Interpretationen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115580</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115580</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 06 Sep 2011 08:33:59 GMT</pubDate></item><item><title><![CDATA[Reply to struct alignment on Tue, 06 Sep 2011 08:58:47 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>So als Tip: Lesen und schreiben von strukturierten Daten implementiert man am Besten elementweise. Dann hat man solche Probleme nicht.</p>
</blockquote>
<p>Nein, das kann doch keiner lesen oder gar verstehen. <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/2115590</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115590</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 06 Sep 2011 08:58:47 GMT</pubDate></item><item><title><![CDATA[Reply to struct alignment on Tue, 06 Sep 2011 10:00:53 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>Tachyon schrieb:</p>
<blockquote>
<p>So als Tip: Lesen und schreiben von strukturierten Daten implementiert man am Besten elementweise. Dann hat man solche Probleme nicht.</p>
</blockquote>
<p>Nein, das kann doch keiner lesen oder gar verstehen. <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>
</blockquote>
<p>Und die Lösung wäre dann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115620</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115620</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Tue, 06 Sep 2011 10:00:53 GMT</pubDate></item><item><title><![CDATA[Reply to struct alignment on Tue, 06 Sep 2011 10:12:09 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>knivil schrieb:</p>
<blockquote>
<p>Tachyon schrieb:</p>
<blockquote>
<p>So als Tip: Lesen und schreiben von strukturierten Daten implementiert man am Besten elementweise. Dann hat man solche Probleme nicht.</p>
</blockquote>
<p>Nein, das kann doch keiner lesen oder gar verstehen. <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>
</blockquote>
<p>Und die Lösung wäre dann?</p>
</blockquote>
<p>Ironie verstehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115624</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115624</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 06 Sep 2011 10:12:09 GMT</pubDate></item></channel></rss>