<?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 padding und #pragma pack(1)]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich muss für eine Uni-Aufgabe ein bitmap file einlesen, es manipulieren und wieder speichern. Dabei bin ich auf dass padding/alignment problem von structs gestossen. Der Bitmap fileheader setzt sich aus 14 bytes zusammen, und zwar so:</p>
<pre><code class="language-cpp">typedef struct {

  unsigned short int signature;
  unsigned int size;
  unsigned int reserved;
  unsigned int bitsOffset;

} BMP_HEADER;
</code></pre>
<p>Wenn allerdings die Wortgrösse des Systems 4 bytes beträgt, werden vom compiler nach <em>signature</em> 2 padding bytes eingefügt, damit size am anfang eines wortes liegt. Nach dem kompilieren hat die oben erwähnte struct eine Grösse von 16 statt 14. Das ganze hat soweit ich es verstanden habe den Sinn, dass pro leseoperation ein wort gelesen werden kann, und sonst für das lesen vom rest des structs jeweils 2 operationen benötigt würden.</p>
<p>Mein Problem liegt darin, dass der bitmap header <em>GENAU</em> 14 bytes gross ist, und wenn ich ihn in die struct lade, die gepadded wurde, stimmen die werte nicht mehr. Nach einigem googlen habe ich die präprozessor direktive #pragma pack(1) gefunden, die das padding des compilers unterbindet. Mit dieser direktive funktioniert es dann auch einwandfrei. Leider soll #pragma pack(1) nicht von allen compilern unterstützt werden, und ist somit nicht crossplatform-kompatibel. Des weiteren dürfte es wesentlich langsamer sein, als mit padding, wegen der doppelten Speicherzugriffe.</p>
<p>Meine Frage ist nun, wie kann man das Problem lösen, ohne #pragma pack(1) zu verwenden ?</p>
<p>-robert</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/238607/struct-padding-und-pragma-pack-1</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 00:08:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/238607.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 13 Apr 2009 09:11:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to struct padding und #pragma pack(1) on Mon, 13 Apr 2009 09:11:18 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich muss für eine Uni-Aufgabe ein bitmap file einlesen, es manipulieren und wieder speichern. Dabei bin ich auf dass padding/alignment problem von structs gestossen. Der Bitmap fileheader setzt sich aus 14 bytes zusammen, und zwar so:</p>
<pre><code class="language-cpp">typedef struct {

  unsigned short int signature;
  unsigned int size;
  unsigned int reserved;
  unsigned int bitsOffset;

} BMP_HEADER;
</code></pre>
<p>Wenn allerdings die Wortgrösse des Systems 4 bytes beträgt, werden vom compiler nach <em>signature</em> 2 padding bytes eingefügt, damit size am anfang eines wortes liegt. Nach dem kompilieren hat die oben erwähnte struct eine Grösse von 16 statt 14. Das ganze hat soweit ich es verstanden habe den Sinn, dass pro leseoperation ein wort gelesen werden kann, und sonst für das lesen vom rest des structs jeweils 2 operationen benötigt würden.</p>
<p>Mein Problem liegt darin, dass der bitmap header <em>GENAU</em> 14 bytes gross ist, und wenn ich ihn in die struct lade, die gepadded wurde, stimmen die werte nicht mehr. Nach einigem googlen habe ich die präprozessor direktive #pragma pack(1) gefunden, die das padding des compilers unterbindet. Mit dieser direktive funktioniert es dann auch einwandfrei. Leider soll #pragma pack(1) nicht von allen compilern unterstützt werden, und ist somit nicht crossplatform-kompatibel. Des weiteren dürfte es wesentlich langsamer sein, als mit padding, wegen der doppelten Speicherzugriffe.</p>
<p>Meine Frage ist nun, wie kann man das Problem lösen, ohne #pragma pack(1) zu verwenden ?</p>
<p>-robert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1695137</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1695137</guid><dc:creator><![CDATA[pulse00]]></dc:creator><pubDate>Mon, 13 Apr 2009 09:11:18 GMT</pubDate></item><item><title><![CDATA[Reply to struct padding und #pragma pack(1) on Mon, 13 Apr 2009 09:14:29 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Ich bin mir selber nicht sicher und möchte keine Lügen verbreiten, aber gilt die Strukturenoptimierung nicht nur bei Visual Studio?</p>
<p>Mfg.<br />
way</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1695140</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1695140</guid><dc:creator><![CDATA[Kóyaánasqatsi]]></dc:creator><pubDate>Mon, 13 Apr 2009 09:14:29 GMT</pubDate></item><item><title><![CDATA[Reply to struct padding und #pragma pack(1) on Mon, 13 Apr 2009 09:18:01 GMT]]></title><description><![CDATA[<p>Indem du nicht ein <code>struct</code> einliest, sondern die einzelnen Werte. Also in dieser Reihenfolgen:<br />
- read signature<br />
- read size<br />
- read reserved<br />
- read bitsOffset</p>
<p>Des Weiteren ist der präsentierte Code C. In C++ würde man es so machen:</p>
<pre><code class="language-cpp">struct BMP_HEADER
{
  unsigned short int signature;
  unsigned int size;
  unsigned int reserved;
  unsigned int bitsOffset;
};
</code></pre>
<p>Oder am besten gleich eine Klasse mit Getter und Setter. Oder bist du einfach im Forum?</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1695141</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1695141</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 13 Apr 2009 09:18:01 GMT</pubDate></item><item><title><![CDATA[Reply to struct padding und #pragma pack(1) on Mon, 13 Apr 2009 09:20:23 GMT]]></title><description><![CDATA[<p>Du musst die Werte des Header einzeln aus der Datei lesen und von da einzeln in die Struktur schreiben. Der Compiler darf das struct so ziemlich organisieren wie er will und endianess kann dir auchnoch einen Strich durch die Rechnung machen.<br />
geloescht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1695143</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1695143</guid><dc:creator><![CDATA[geloescht]]></dc:creator><pubDate>Mon, 13 Apr 2009 09:20:23 GMT</pubDate></item><item><title><![CDATA[Reply to struct padding und #pragma pack(1) on Mon, 13 Apr 2009 09:23:15 GMT]]></title><description><![CDATA[<p>da bin ich wohl auf der Leitung gestanden, danke für die Hilfe!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1695146</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1695146</guid><dc:creator><![CDATA[pulse00]]></dc:creator><pubDate>Mon, 13 Apr 2009 09:23:15 GMT</pubDate></item><item><title><![CDATA[Reply to struct padding und #pragma pack(1) on Mon, 13 Apr 2009 09:32:05 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Des Weiteren ist der präsentierte Code C. In C++ würde man es so machen:</p>
</blockquote>
<p>Danke, hab ich nicht gewusst dass c++ structs anders aussehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1695153</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1695153</guid><dc:creator><![CDATA[pulse00]]></dc:creator><pubDate>Mon, 13 Apr 2009 09:32:05 GMT</pubDate></item><item><title><![CDATA[Reply to struct padding und #pragma pack(1) on Mon, 13 Apr 2009 11:48:53 GMT]]></title><description><![CDATA[<p>pulse00 schrieb:</p>
<blockquote>
<p>Danke, hab ich nicht gewusst dass c++ structs anders aussehen.</p>
</blockquote>
<p>Dein Code ist natürlich auch gültiges C++. Nur war es in C noch nötig, das <code>typedef</code> hinzuschreiben, um den Strukturnamen gleich als Typbezeichner zu wählen.</p>
<p>In C hättest du ohne <code>typedef</code> bei der Deklaration immer sowas schreiben müssen:</p>
<pre><code class="language-cpp">struct BMP_HEADER var;
</code></pre>
<p>In C++ kannst du dir das <code>struct</code> sparen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1695200</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1695200</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 13 Apr 2009 11:48:53 GMT</pubDate></item></channel></rss>