<?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[sizeof() bei struct]]></title><description><![CDATA[<p>Moin. Ich kriege bei der Ausgabe eines sizeof ein Ergebnis, das ich mir noch nciht so ganz erklaeren kann.</p>
<pre><code class="language-cpp">union uval {  
  void* ptr;
  SizeDepend&lt;sizeof(void*)&gt;::IntT i;
  SizeDepend&lt;sizeof(void*)&gt;::FloatT flt;
  bool bol;
};

struct Value
{
  char tid;
  uval val;
};

int main()
{
  std::cout&lt;&lt;sizeof(Value)&lt;&lt;std::endl;
  std::cout&lt;&lt;sizeof(uval)&lt;&lt;std::endl;
  std::cout&lt;&lt;sizeof(void*)&lt;&lt;std::endl;
  std::cout&lt;&lt;sizeof(bool)&lt;&lt;std::endl;
  std::cout&lt;&lt;sizeof(SizeDepend&lt;sizeof(void*)&gt;::IntT)&lt;&lt;std::endl;
  std::cout&lt;&lt;sizeof(SizeDepend&lt;sizeof(void*)&gt;::FloatT)&lt;&lt;std::endl;
}
</code></pre>
<p>gibt als ausgabe:<br />
8<br />
4<br />
4<br />
1<br />
4<br />
4</p>
<p>Jetzt ist die Frage: warum 8 bei sizeof(Value)? 5 wuerde doch reichen, oder hat der COmpiler keinen Bock auf Krumme Zahlen?</p>
<p>(SizeDepend ist eine kleine Templatespielerei, die mir fuer eine gegebene Zahl N den groessten(genauesten) Integer- und Float Typ ermittelt, der &lt;= N bytes belegt)</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/188350/sizeof-bei-struct</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 02:31:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/188350.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 30 Jul 2007 15:08:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to sizeof() bei struct on Mon, 30 Jul 2007 15:08:00 GMT]]></title><description><![CDATA[<p>Moin. Ich kriege bei der Ausgabe eines sizeof ein Ergebnis, das ich mir noch nciht so ganz erklaeren kann.</p>
<pre><code class="language-cpp">union uval {  
  void* ptr;
  SizeDepend&lt;sizeof(void*)&gt;::IntT i;
  SizeDepend&lt;sizeof(void*)&gt;::FloatT flt;
  bool bol;
};

struct Value
{
  char tid;
  uval val;
};

int main()
{
  std::cout&lt;&lt;sizeof(Value)&lt;&lt;std::endl;
  std::cout&lt;&lt;sizeof(uval)&lt;&lt;std::endl;
  std::cout&lt;&lt;sizeof(void*)&lt;&lt;std::endl;
  std::cout&lt;&lt;sizeof(bool)&lt;&lt;std::endl;
  std::cout&lt;&lt;sizeof(SizeDepend&lt;sizeof(void*)&gt;::IntT)&lt;&lt;std::endl;
  std::cout&lt;&lt;sizeof(SizeDepend&lt;sizeof(void*)&gt;::FloatT)&lt;&lt;std::endl;
}
</code></pre>
<p>gibt als ausgabe:<br />
8<br />
4<br />
4<br />
1<br />
4<br />
4</p>
<p>Jetzt ist die Frage: warum 8 bei sizeof(Value)? 5 wuerde doch reichen, oder hat der COmpiler keinen Bock auf Krumme Zahlen?</p>
<p>(SizeDepend ist eine kleine Templatespielerei, die mir fuer eine gegebene Zahl N den groessten(genauesten) Integer- und Float Typ ermittelt, der &lt;= N bytes belegt)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1335039</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1335039</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 30 Jul 2007 15:08:00 GMT</pubDate></item><item><title><![CDATA[Reply to sizeof() bei struct on Mon, 30 Jul 2007 15:15:09 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>5 wuerde doch reichen, oder hat der COmpiler keinen Bock auf Krumme Zahlen?</p>
</blockquote>
<p>exakt. krumme zahlen sind doof, weil sie nicht schön sind. es geht dabei um effektive speicher operationen. 5 bytes schaufeln ist doof. weil man kann 8 bytes auf einmal problemlos schaufeln. wenn man aber zwingend 5 haben will, dann muss man sie einzeln schaufeln, oder anderweitig sichern dass die 3 &quot;nutzlosen&quot; bytes die man schaufelt nichts kaputt machen.</p>
<p>ergo ist es einfacher 3 bytes zu verschwenden (siehe &quot;Padding&quot;) als bei jeder operation auf die fallstricke zu achten.</p>
<p>das passende alignment wird von der unterliegenden plattform definiert. unter 32 bit systemen ist 8 eben eine passende zahl. auf anderen systemen mag 12 besser sein oder vielleicht auch 6.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1335045</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1335045</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Mon, 30 Jul 2007 15:15:09 GMT</pubDate></item><item><title><![CDATA[Reply to sizeof() bei struct on Mon, 30 Jul 2007 22:18:21 GMT]]></title><description><![CDATA[<p>Der Grund ist: damit &quot;uval&quot; immer auf einer durch 4 teilbaren Adresse liegt.<br />
Dann kann die CPU nämlich schneller darauf zugreifen.</p>
<p>Auf manchen Systemen kann die CPU sogar NUR dann auf ein &quot;long&quot; zugreifen wenn dieses &quot;long&quot; auf einer durch 4 teilbaren Adresse liegt. Auf solchen Systemen MUSS der Compiler also die Struktur 8 Byte gross machen, da sonst bei Arrays für die einzelnen Elemente nichtmehr garantiert wäre dass &quot;uval&quot; auf einer durch 4 teilbaren Adresse liegen würde.</p>
<p>D.h. in deinem Beispiel wird jeder mir bekannte Compiler die 3 &quot;Füllbytes&quot; nicht hinten dran packen, sondern als &quot;Loch&quot; zwischen dem &quot;char&quot; und dem &quot;uval&quot; einfügen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1335318</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1335318</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 30 Jul 2007 22:18:21 GMT</pubDate></item><item><title><![CDATA[Reply to sizeof() bei struct on Tue, 31 Jul 2007 07:28:49 GMT]]></title><description><![CDATA[<p>Hallo pumuckl,</p>
<p>was du entdeckt hast wird Speicherausrichtung, im Englischen &quot;packing alignment&quot; genannt. Ein 8 Bit Prozessor braucht keine Speicherausrichtung um optimal arbeiten zu können. Ein 16 Bit Prozessor benötigt eine 2 Byte Ausrichtung und ein 32 Bit Prozessor eine 4 Byte Ausrichtung. Warum das so ist, ist ja leicht einzusehen. Manche Compiler haben bereits eine 8 Byte Speicherausrichtung für 64Bit Prozessoren als Standard voreingestellt.</p>
<p>Bei den M$ Compilern wird mit der Option /Zp die Speicherausrichtung eingestellt ( /Zp[1|2|4|8|16] z.B. /Zp1 für „packing alignment off“).</p>
<p>Mit den Preprozessor Befehl pack kann man das Verhalten pro Deklaration beeinflussen. Mit</p>
<pre><code class="language-cpp">#pragma pack(1)
struct Value
{
  char tid;
  uval val;
};
</code></pre>
<p>könntest du die erwartete Speicherausrichtung erreichen (sizeof(Value)==5).<br />
Wichtig ist das z.B. wenn Daten in ein bestimmten Format abgespeichert werden sollen oder bei Datenaustausch zwischen Systemen mit unterschiedlicher Speicherausrichtung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1335426</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1335426</guid><dc:creator><![CDATA[BerndD]]></dc:creator><pubDate>Tue, 31 Jul 2007 07:28:49 GMT</pubDate></item><item><title><![CDATA[Reply to sizeof() bei struct on Tue, 31 Jul 2007 07:35:54 GMT]]></title><description><![CDATA[<p>Naja, da SizeDepend&lt;sizeof(void*)&gt;::IntT wohl ein long sein wird (4 byte) und da das ganze eh nur erste spielereien sind, werd ich da nicht manuell in der Speicherbelegung rumfuhrwerken. Aber danke für die Erklärungen <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/1335430</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1335430</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 31 Jul 2007 07:35:54 GMT</pubDate></item><item><title><![CDATA[Reply to sizeof() bei struct on Tue, 31 Jul 2007 08:21:44 GMT]]></title><description><![CDATA[<p>BerndD schrieb:</p>
<blockquote>
<p>...Ein 8 Bit Prozessor braucht keine Speicherausrichtung um optimal arbeiten zu können....</p>
</blockquote>
<p>Dann warte mal auf die Diskussion mit Bitfeldern... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Aber ansonsten hast Du natürlich Recht.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1335461</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1335461</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 31 Jul 2007 08:21:44 GMT</pubDate></item><item><title><![CDATA[Reply to sizeof() bei struct on Tue, 31 Jul 2007 23:18:56 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/16722">@BerndD</a>: die 8 Byte Alignment sind nicht für kommende 64 Bit CPUs voreingestellt, sondern weil es bei fast jeder CPU (ob nun 16, 32 oder 64 Bit) besser ist.</p>
<p>Das liegt unter anderem daran dass es meistens &quot;schlecht&quot; (langsamer) ist wenn eine Struktur auf 2 verschiedene Cache-Lines aufgeteilt wird, oder gar auf 2 verschiedene MMU Pages.<br />
Mit einem Alignment von 8 Byte verhindert man das effektiv für alle Strukturen die &lt;= 8 Byte sind.</p>
<p>Zusätzlich bringt es Vorteile wenn ein N-Byte breiter Zugriff auf eine durch N teilbare Adresse erfolgt. Und ein 486er oder Pentium macht durchaus 8-Byte breite Zugriffe (obwohl es eine 32 Bit CPU ist), nämlich z.B. für doubles.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1336206</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1336206</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 31 Jul 2007 23:18:56 GMT</pubDate></item></channel></rss>