<?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[Der sizeof Operator liefert falsche Grösse?]]></title><description><![CDATA[<p>Hallo zusammen<br />
Ich habe hier ein ziemlich merkwürdiges Problem beim Parsen einer 3ds Datei und konnte den Fehler mittlerweile auf einen falschen Rückgabewert des sizeof Operators zurückverfolgen. Ich habe folgende Struktur:</p>
<p>struct DsTokenHeader{<br />
uint16 ID;<br />
uint32 Size;<br />
};</p>
<p>Aber sizeof(DsTokenHeader) gibt mir den Wert 8 zurück? 4+2 = 8? <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>
<p>Mfg Samuel</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/263887/der-sizeof-operator-liefert-falsche-grösse</link><generator>RSS for Node</generator><lastBuildDate>Sat, 05 Sep 2026 12:13:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/263887.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 29 Mar 2010 11:00:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Der sizeof Operator liefert falsche Grösse? on Mon, 29 Mar 2010 11:00:16 GMT]]></title><description><![CDATA[<p>Hallo zusammen<br />
Ich habe hier ein ziemlich merkwürdiges Problem beim Parsen einer 3ds Datei und konnte den Fehler mittlerweile auf einen falschen Rückgabewert des sizeof Operators zurückverfolgen. Ich habe folgende Struktur:</p>
<p>struct DsTokenHeader{<br />
uint16 ID;<br />
uint32 Size;<br />
};</p>
<p>Aber sizeof(DsTokenHeader) gibt mir den Wert 8 zurück? 4+2 = 8? <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>
<p>Mfg Samuel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1874978</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1874978</guid><dc:creator><![CDATA[Ishildur]]></dc:creator><pubDate>Mon, 29 Mar 2010 11:00:16 GMT</pubDate></item><item><title><![CDATA[Reply to Der sizeof Operator liefert falsche Grösse? on Mon, 29 Mar 2010 11:04:39 GMT]]></title><description><![CDATA[<p><a href="http://de.wikipedia.org/wiki/Speicherausrichtung" rel="nofollow">http://de.wikipedia.org/wiki/Speicherausrichtung</a><br />
<a href="http://de.wikipedia.org/wiki/Padding" rel="nofollow">http://de.wikipedia.org/wiki/Padding</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1874980</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1874980</guid><dc:creator><![CDATA[Registrierter Troll]]></dc:creator><pubDate>Mon, 29 Mar 2010 11:04:39 GMT</pubDate></item><item><title><![CDATA[Reply to Der sizeof Operator liefert falsche Grösse? on Mon, 29 Mar 2010 11:06:24 GMT]]></title><description><![CDATA[<p>Der Compiler darf Strukturen beliebig vergrößern, damit die einzelnen Elemente im Speicher günstiger (soll heißen an z.B. 4 Byte Grenzen) liegen. Das ganze wird padding genannt.</p>
<p>Du kannst entweder beide Werte einzeln einlesen, dass ist der portabelste Weg.<br />
Alternativ kannst du den Compiler anweisen, dass er die Struktur packen soll, also die padding bytes weglässt.<br />
Beim gcc sieht das so aus:</p>
<pre><code class="language-cpp">struct DsTokenHeader{
  uint16 ID;
  uint32 Size;
} __attribute__((packed));
</code></pre>
<p>Beim MSVC müsste es so gehen</p>
<pre><code class="language-cpp">#pragma pack(push, 1)
struct DsTokenHeader{
  uint16 ID;
  uint32 Size;
};
#pragma pack(pop)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1874983</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1874983</guid><dc:creator><![CDATA[DerKuchen]]></dc:creator><pubDate>Mon, 29 Mar 2010 11:06:24 GMT</pubDate></item><item><title><![CDATA[Reply to Der sizeof Operator liefert falsche Grösse? on Mon, 29 Mar 2010 11:09:31 GMT]]></title><description><![CDATA[<p>Wozu benötigst du denn die Größe? Normalerweise benötigt man die Größe nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1874985</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1874985</guid><dc:creator><![CDATA[Janjan]]></dc:creator><pubDate>Mon, 29 Mar 2010 11:09:31 GMT</pubDate></item><item><title><![CDATA[Reply to Der sizeof Operator liefert falsche Grösse? on Mon, 29 Mar 2010 11:26:36 GMT]]></title><description><![CDATA[<p>Sobald es übers Netzwerk etc. geht, brauchst du die Größe um zu sehen ob alle Daten da sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1874996</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1874996</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Mon, 29 Mar 2010 11:26:36 GMT</pubDate></item><item><title><![CDATA[Reply to Der sizeof Operator liefert falsche Grösse? on Mon, 29 Mar 2010 11:28:39 GMT]]></title><description><![CDATA[<p>Fellhuhn schrieb:</p>
<blockquote>
<p>Sobald es übers Netzwerk etc. geht, brauchst du die Größe um zu sehen ob alle Daten da sind.</p>
</blockquote>
<p>Und genau da macht man was falsch. Man darf niemals direkt in eine Struktur lesen oder aus dieser schreiben. Auch darf man nicht anhand der Struktur-Größe prüfen ob alle Daten angekommen sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1874999</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1874999</guid><dc:creator><![CDATA[Janjan]]></dc:creator><pubDate>Mon, 29 Mar 2010 11:28:39 GMT</pubDate></item><item><title><![CDATA[Reply to Der sizeof Operator liefert falsche Grösse? on Mon, 29 Mar 2010 11:33:33 GMT]]></title><description><![CDATA[<p>Ojeoje I see, I see...<br />
Fragt sich, wieso sie beim 3ds Format ein 6Byte Header verwendet haben? Ist das Format so alt, dass es noch aus der 16Bit Ära stammt? Dort hätte es natürlich kein Padding gemacht für 6Bytes...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1875004</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875004</guid><dc:creator><![CDATA[Ishildur]]></dc:creator><pubDate>Mon, 29 Mar 2010 11:33:33 GMT</pubDate></item><item><title><![CDATA[Reply to Der sizeof Operator liefert falsche Grösse? on Mon, 29 Mar 2010 11:39:23 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24658">@Janjan</a></p>
<pre><code class="language-cpp">// obtain the assigned resource reader and open the data source
ResourceReader *pRdr = this-&gt;GetReader();
pRdr-&gt;Open();

// allocate memory and load the entire data into memory
uint32 szSrc = pRdr-&gt;Size();
uint8 *pDta  = new uint8[szSrc];
uint8 *pEnd  = pDta + szSrc;
pRdr-&gt;Read(pDta,0,szSrc);
</code></pre>
<p>Weil ich folgenden Code schöner finde</p>
<pre><code class="language-cpp">// throw an exception if the signature inside the *.3ds file is invalid
 DsTokenHeader *pHdr = reinterpret_cast&lt;DsTokenHeader*&gt;(pDta);
 if(pHdr-&gt;ID != 0x4d4d) throw DecoderException(FNC,stHdr);
 if(pHdr-&gt;Size != szSrc) throw DecoderException(FNC,stHdr);
 pDta += sizeof(DsTokenHeader);
</code></pre>
<p>als diesen hier (leider funktioniert &quot;dank&quot; dem Padding nur dieser hier...)</p>
<pre><code class="language-cpp">// throw an exception if the signature inside the *.3ds file is invalid
 if(*reinterpret_cast&lt;uint16*&gt;(pDta) != 0x4d4d) throw DecoderException(FNC,stHdr);
 if(*reinterpret_cast&lt;uint32*&gt;(pDta+2) != szSrc) throw DecoderException(FNC,stHdr);
 pDta += 6;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1875005</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875005</guid><dc:creator><![CDATA[Ishildur]]></dc:creator><pubDate>Mon, 29 Mar 2010 11:39:23 GMT</pubDate></item><item><title><![CDATA[Reply to Der sizeof Operator liefert falsche Grösse? on Mon, 29 Mar 2010 11:37:34 GMT]]></title><description><![CDATA[<p>Warum sollte man dort unbedingt ein Padding machen? Ist letztendlich im Dateiformat egal. Du liest 6 byte und hast deinen Header. Du musst nur eben die Werte einzeln in deine Struktur kopieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1875007</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875007</guid><dc:creator><![CDATA[Janjan]]></dc:creator><pubDate>Mon, 29 Mar 2010 11:37:34 GMT</pubDate></item><item><title><![CDATA[Reply to Der sizeof Operator liefert falsche Grösse? on Mon, 29 Mar 2010 11:38:38 GMT]]></title><description><![CDATA[<p>Ishildur schrieb:</p>
<blockquote>
<p>Ojeoje I see, I see...<br />
Fragt sich, wieso sie beim 3ds Format ein 6Byte Header verwendet haben? Ist das Format so alt, dass es noch aus der 16Bit Ära stammt? Dort hätte es natürlich kein Padding gemacht für 6Bytes...</p>
</blockquote>
<p>also sollte man immer dafür sorgen, dass eigene structs mind. 64bit groß ist, wenn man modern erscheinen möchte? Oo<br />
wie schon gesagt wurde, ist dein weg nicht gerade hübsch und die größe völlig belanglos...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1875010</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875010</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Mon, 29 Mar 2010 11:38:38 GMT</pubDate></item><item><title><![CDATA[Reply to Der sizeof Operator liefert falsche Grösse? on Mon, 29 Mar 2010 11:39:48 GMT]]></title><description><![CDATA[<p>Gerade der zweite sollte nicht funktionieren!!</p>
<p>Denn da gibst du ja von Hand an, bei welchem Byte dein Integer startet (pDta+2). Also machst du schon vorher irgendwo etwas falsch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1875011</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875011</guid><dc:creator><![CDATA[Janjan]]></dc:creator><pubDate>Mon, 29 Mar 2010 11:39:48 GMT</pubDate></item><item><title><![CDATA[Reply to Der sizeof Operator liefert falsche Grösse? on Mon, 29 Mar 2010 11:40:53 GMT]]></title><description><![CDATA[<p>Ishildur schrieb:</p>
<blockquote>
<p>Weil ich folgenden Code schöner finde</p>
<pre><code class="language-cpp">// throw an exception if the signature inside the *.3ds file is invalid
 DsTokenHeader *pHdr = reinterpret_cast&lt;DsTokenHeader*&gt;(pDta);
 if(pHdr-&gt;ID != 0x4d4d) throw DecoderException(FNC,stHdr);
 if(pHdr-&gt;Size != szSrc) throw DecoderException(FNC,stHdr);
 pDta += sizeof(DsTokenHeader);
</code></pre>
</blockquote>
<p>Ist vielleicht schöner, hat aber leider ein undefiniertes Resultat. Du gehst hier von einem bestimmten Struktur-Layout aus, das vom Standard nicht garantiert wird und Sache des Compilers ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1875013</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875013</guid><dc:creator><![CDATA[Registrierter Troll]]></dc:creator><pubDate>Mon, 29 Mar 2010 11:40:53 GMT</pubDate></item><item><title><![CDATA[Reply to Der sizeof Operator liefert falsche Grösse? on Mon, 29 Mar 2010 11:41:29 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/16305">@unskilled</a></p>
<pre><code class="language-cpp">ist dein weg nicht gerade hübsch und die größe völlig belanglos...
</code></pre>
<p>Ok, wie mache ich es hübscher? <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/1875014</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875014</guid><dc:creator><![CDATA[Ishildur]]></dc:creator><pubDate>Mon, 29 Mar 2010 11:41:29 GMT</pubDate></item><item><title><![CDATA[Reply to Der sizeof Operator liefert falsche Grösse? on Mon, 29 Mar 2010 11:43:09 GMT]]></title><description><![CDATA[<p>Ishildur schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/16305">@unskilled</a></p>
<pre><code class="language-cpp">ist dein weg nicht gerade hübsch und die größe völlig belanglos...
</code></pre>
<p>Ok, wie mache ich es hübscher? <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>Struktur erstellen. 2 Byte in ID laden, 4 byte in Size laden. Nicht 6 byte direkt in die Struktur laden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1875016</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875016</guid><dc:creator><![CDATA[Janjan]]></dc:creator><pubDate>Mon, 29 Mar 2010 11:43:09 GMT</pubDate></item><item><title><![CDATA[Reply to Der sizeof Operator liefert falsche Grösse? on Mon, 29 Mar 2010 11:43:20 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24658">@Janjan</a><br />
Doch genau das zweite funktioniert eben, weil ich dort keine Strukturen verwende, die gepadded werden. Und der pDta Pointer enthält einen Zeiger auf eine Speicheradresse, wo ich vorher das komplette File hineinlese. Und im 3ds File format ist nunmal ein Header: 2 Bytes für die ID und 4 Bytes für die Grösse.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1875017</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875017</guid><dc:creator><![CDATA[Ishildur]]></dc:creator><pubDate>Mon, 29 Mar 2010 11:43:20 GMT</pubDate></item><item><title><![CDATA[Reply to Der sizeof Operator liefert falsche Grösse? on Mon, 29 Mar 2010 11:47:34 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24658">@Janjan</a><br />
So?</p>
<pre><code class="language-cpp">DsTokenHeader hdr;
memcpy(&amp;hdr,pDta,2);
memcpy(&amp;hdr.Size,pDta+2,4);

// throw an exception if the signature inside the *.3ds file is invalid
if(hdr.ID != 0x4d4d) throw DecoderException(FNC,stHdr);
if(hdr.Size != szSrc) throw DecoderException(FNC,stHdr);
pDta += 6;
</code></pre>
<p>Bleibt vielleicht noch zu erwähnen, dass ich das ziemlich oft an ziemlich vielen verschiedenen Stellen machen muss...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1875019</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875019</guid><dc:creator><![CDATA[Ishildur]]></dc:creator><pubDate>Mon, 29 Mar 2010 11:47:34 GMT</pubDate></item><item><title><![CDATA[Reply to Der sizeof Operator liefert falsche Grösse? on Mon, 29 Mar 2010 11:59:08 GMT]]></title><description><![CDATA[<p>Du programmierst C++, kein C. Also lass das memcpy weg.</p>
<pre><code>hdr.ID   = *reinterpret_cast&lt;uint16*&gt;(pDta);
hdr.Size = *reinterpret_cast&lt;uint32*&gt;(pDta+2);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1875030</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875030</guid><dc:creator><![CDATA[Janjan]]></dc:creator><pubDate>Mon, 29 Mar 2010 11:59:08 GMT</pubDate></item><item><title><![CDATA[Reply to Der sizeof Operator liefert falsche Grösse? on Mon, 29 Mar 2010 12:08:15 GMT]]></title><description><![CDATA[<p>Aha:</p>
<pre><code class="language-cpp">// first copy the header onto the stack (which is an unnecessary and useless overhead by the way, but ok, we are programming C++ ;-)
 DsTokenHeader hdr;
 hdr.ID   = *reinterpret_cast&lt;uint16*&gt;(pDta);
 hdr.Size = *reinterpret_cast&lt;uint32*&gt;(pDta+2);

 // throw an exception if the signature inside the *.3ds file is invalid
 if(hdr.ID != 0x4d4d) throw DecoderException(FNC,stHdr);
 if(hdr.Size != szSrc) throw DecoderException(FNC,stHdr);
 pDta += 6;
</code></pre>
<p>anstatt:</p>
<pre><code class="language-cpp">// throw an exception if the signature inside the *.3ds file is invalid
 if(*reinterpret_cast&lt;uint16*&gt;(pDta) != 0x4d4d) throw DecoderException(FNC,stHdr);
 if(*reinterpret_cast&lt;uint32*&gt;(pDta+2) != szSrc) throw DecoderException(FNC,stHdr);
 pDta += 6;
</code></pre>
<p>Sag mal, kann es sein, dass du pro Codezeile bezahlt wirst? :p</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1875034</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875034</guid><dc:creator><![CDATA[Ishildur]]></dc:creator><pubDate>Mon, 29 Mar 2010 12:08:15 GMT</pubDate></item><item><title><![CDATA[Reply to Der sizeof Operator liefert falsche Grösse? on Mon, 29 Mar 2010 12:11:50 GMT]]></title><description><![CDATA[<p>Code 1 hast du die Daten bereits in deiner Struktur und kannst die Struktur weiterverwenden.</p>
<p>Code 2 müsstest du die Daten im nachhinein nochmal in die Struktur kopieren um sie zu verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1875036</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875036</guid><dc:creator><![CDATA[Janjan]]></dc:creator><pubDate>Mon, 29 Mar 2010 12:11:50 GMT</pubDate></item><item><title><![CDATA[Reply to Der sizeof Operator liefert falsche Grösse? on Mon, 29 Mar 2010 12:18:58 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24658">@Janjan</a><br />
Hehe nein ist schon klar <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="😉"
    /><br />
Es ist hier ein wenig speziell, da ich die Daten nur ein einziges Mal benötige, da ich ja jedes Token nur ein einziges Mal auslese. Aber du hast natürlich recht, wenn ich die Daten mehrmals benötige, würde ich es auch so machen wie du. Es ist halt reine Faulheit, dass ich gerne ganze Strukturen kopiere, anstatt da jedes Element einzeln, aber dann muss man halt höllisch aufpassen, dass bei den verwendeten Strukturen kein Padding auftritt. Im Zusammenhang mit der Umstellung auf 64bit werden wohl allerdings so einige Dateiimporter nicht mehr funktionieren. Bspw.</p>
<pre><code class="language-cpp">struct PcmHeader{
 int8  RiffSig[4];
 int32 WaveformChunkSize;
 int8  WaveSig[4];
 int8  FormaSig[4];
 int32 FormatChunkSize;
 int16 FormatTag;
 int16 Channels;
 int32 SampleRate;
 int32 BytesPerSec;
 int16 BlockAlign;
 int16 BitsPerSample;
 int8  DataSig[4];
 int32 DataSize;
};
</code></pre>
<p>Diese Struktur ist 32-bit alignet, es findet IMHO nirgends ein Padding statt. Daher funktioniert ein memcpy problemlos. Bei der Umstellung auf 64bit geht dann leider gar nichts mehr, da heissts dann Member by Member...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1875044</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875044</guid><dc:creator><![CDATA[Ishildur]]></dc:creator><pubDate>Mon, 29 Mar 2010 12:18:58 GMT</pubDate></item><item><title><![CDATA[Reply to Der sizeof Operator liefert falsche Grösse? on Mon, 29 Mar 2010 12:19:34 GMT]]></title><description><![CDATA[<p>Möglicherweise irre ich mich, aber ich glaube zu wissen dass dieser Speicherzugriff nach <code>reinterpret_cast</code> vom Standard nicht erlaubt wird. Der Hintergrund ist, dass Speicherzugriffe je nach Architektur nur an korrekt ausgerichteten Adressen ausgeführt werden können. Ein gelesener 32-Bit-Wert muss z. B. an einer 32-Bit-Adresse ausgerichtet sein. Das ist hier nicht garantiert.</p>
<p>Falls ich mich irre, werde ich sicher bald korrigiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1875045</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875045</guid><dc:creator><![CDATA[Registrierter Troll]]></dc:creator><pubDate>Mon, 29 Mar 2010 12:19:34 GMT</pubDate></item><item><title><![CDATA[Reply to Der sizeof Operator liefert falsche Grösse? on Mon, 29 Mar 2010 12:21:03 GMT]]></title><description><![CDATA[<p>Ishildur schrieb:</p>
<blockquote>
<p>Diese Struktur ist 32-bit alignet, es findet IMHO nirgends ein Padding statt. Daher funktioniert ein memcpy problemlos.</p>
</blockquote>
<p>Zufall. Die Reihenfolge der einzelnen Felder im Speicher ist nicht definiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1875048</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875048</guid><dc:creator><![CDATA[Registrierter Troll]]></dc:creator><pubDate>Mon, 29 Mar 2010 12:21:03 GMT</pubDate></item><item><title><![CDATA[Reply to Der sizeof Operator liefert falsche Grösse? on Mon, 29 Mar 2010 12:25:51 GMT]]></title><description><![CDATA[<p>Ishildur schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24658">@Janjan</a><br />
Hehe nein ist schon klar <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="😉"
    /><br />
Es ist hier ein wenig speziell, da ich die Daten nur ein einziges Mal benötige, da ich ja jedes Token nur ein einziges Mal auslese. Aber du hast natürlich recht, wenn ich die Daten mehrmals benötige, würde ich es auch so machen wie du. Es ist halt reine Faulheit, dass ich gerne ganze Strukturen kopiere, anstatt da jedes Element einzeln, aber dann muss man halt höllisch aufpassen, dass bei den verwendeten Strukturen kein Padding auftritt. Im Zusammenhang mit der Umstellung auf 64bit werden wohl allerdings so einige Dateiimporter nicht mehr funktionieren. Bspw.</p>
<pre><code class="language-cpp">...
</code></pre>
<p>Diese Struktur ist 32-bit alignet, es findet IMHO nirgends ein Padding statt. Daher funktioniert ein memcpy problemlos. Bei der Umstellung auf 64bit geht dann leider gar nichts mehr, da heissts dann Member by Member...</p>
</blockquote>
<p>Code der <strong>schlecht</strong> programmiert wurde wird nicht mehr funktionieren, da hast du recht.</p>
<p>Wer guten Code produzieren will, der weiß das man nicht direkt aus Strukturen lesen und in Strukturen schreiben darf, genau wegen der Padding Geschichte. <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="😉"
    /> Der Standard schreibt eben nicht vor, dass alle Elemente zusammenhängend im Speicher stehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1875053</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875053</guid><dc:creator><![CDATA[Janjan]]></dc:creator><pubDate>Mon, 29 Mar 2010 12:25:51 GMT</pubDate></item><item><title><![CDATA[Reply to Der sizeof Operator liefert falsche Grösse? on Mon, 29 Mar 2010 12:27:26 GMT]]></title><description><![CDATA[<p>@Registrierter Troll<br />
Du machst mir Angst...<br />
Auf deine Aussage habe ich leider keine Antwort, ich bin immer davon ausgegangen, dass jedes Byte im Speicher adressiert werden kann. Unabhängig von der Architektur. Bei 32bit kann ich ja IMHO ca. 4GB speicher addressieren. Eine Konsequenz deiner Aussage währe ja doch dann, dass ich ca. 16BG adressieren könnte, aber halt nur jedes 4te Byte?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1875057</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875057</guid><dc:creator><![CDATA[Ishildur]]></dc:creator><pubDate>Mon, 29 Mar 2010 12:27:26 GMT</pubDate></item><item><title><![CDATA[Reply to Der sizeof Operator liefert falsche Grösse? on Mon, 29 Mar 2010 12:30:32 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24658">@Janjan</a><br />
Viele Tutorials und Bücher, die ich gelesen habe und die Verarbeitung von Binärdaten behandeln, lesen und schreiben direkt in und aus Strukturen aus oder in Dateien...</p>
<p>Daher bin ich ehrlich gesagt gerade ein wenig schockiert... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1875058</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875058</guid><dc:creator><![CDATA[Ishildur]]></dc:creator><pubDate>Mon, 29 Mar 2010 12:30:32 GMT</pubDate></item><item><title><![CDATA[Reply to Der sizeof Operator liefert falsche Grösse? on Mon, 29 Mar 2010 12:31:52 GMT]]></title><description><![CDATA[<p>Ishildur schrieb:</p>
<blockquote>
<p>@Registrierter Troll<br />
Du machst mir Angst...<br />
Auf deine Aussage habe ich leider keine Antwort, ich bin immer davon ausgegangen, dass jedes Byte im Speicher adressiert werden kann. Unabhängig von der Architektur. Bei 32bit kann ich ja IMHO ca. 4GB speicher addressieren. Eine Konsequenz deiner Aussage währe ja doch dann, dass ich ca. 16BG adressieren könnte, aber halt nur jedes 4te Byte?</p>
</blockquote>
<p>Das ist unsinn. Mag sein, dass eine Architektur nur an jedem 4ten Byte zugreifen kann, aber die Implementierung deines C++ Codes muss dies berücksichtigen. Dann muss eben der geschriebene Maschinencode zur Not 3 byte früher lesen, und die ersten 3 Byte wegwerfen. Darauf musst du dank Standard in deinem Code nicht achten, darauf muss der Compiler für dich achten. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1875060</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1875060</guid><dc:creator><![CDATA[Janjan]]></dc:creator><pubDate>Mon, 29 Mar 2010 12:31:52 GMT</pubDate></item></channel></rss>