<?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[memcpy mit structs]]></title><description><![CDATA[<p>Hi @ all!</p>
<p>Ich habe ein kleines Problem beim Nutzen von memcpy. Hier mal eine abgespeckte Form meines Programms:</p>
<pre><code class="language-cpp">struct HeadStruct
{
  long a;
  long b;
  long c;
  long d;
};

typedef struct HeadStruct HeadStruct;

struct MyStruct
{
  HeadStruct Head;
  long e;
  long f;
  long g;
};

typedef struct MyStruct MtSruct;

template &lt;typename MyStruct&gt;
class MyClass
{
  MyStruct MyStructInClass;
};
</code></pre>
<p>Ich will nun die Daten in einen char-Buffer kopieren (allerdings ohne Head):</p>
<pre><code class="language-cpp">MyClass&lt;MyStruct&gt; A;
char* Buffer;
// das jetzt klappt net...
memcpy(Buffer, &amp;(A.MyStructInClass) + sizeof(HeadStruct), sizeof(A.MyStructInClass) - sizeof(HeadStruct));
</code></pre>
<p>und dann hab ich komischerweise die falschen Werte im Buffer... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/156888/memcpy-mit-structs</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 23:09:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/156888.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 21 Aug 2006 08:59:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to memcpy mit structs on Mon, 21 Aug 2006 08:59:54 GMT]]></title><description><![CDATA[<p>Hi @ all!</p>
<p>Ich habe ein kleines Problem beim Nutzen von memcpy. Hier mal eine abgespeckte Form meines Programms:</p>
<pre><code class="language-cpp">struct HeadStruct
{
  long a;
  long b;
  long c;
  long d;
};

typedef struct HeadStruct HeadStruct;

struct MyStruct
{
  HeadStruct Head;
  long e;
  long f;
  long g;
};

typedef struct MyStruct MtSruct;

template &lt;typename MyStruct&gt;
class MyClass
{
  MyStruct MyStructInClass;
};
</code></pre>
<p>Ich will nun die Daten in einen char-Buffer kopieren (allerdings ohne Head):</p>
<pre><code class="language-cpp">MyClass&lt;MyStruct&gt; A;
char* Buffer;
// das jetzt klappt net...
memcpy(Buffer, &amp;(A.MyStructInClass) + sizeof(HeadStruct), sizeof(A.MyStructInClass) - sizeof(HeadStruct));
</code></pre>
<p>und dann hab ich komischerweise die falschen Werte im Buffer... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1121303</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1121303</guid><dc:creator><![CDATA[WetDreams]]></dc:creator><pubDate>Mon, 21 Aug 2006 08:59:54 GMT</pubDate></item><item><title><![CDATA[Reply to memcpy mit structs on Mon, 21 Aug 2006 09:07:49 GMT]]></title><description><![CDATA[<p>(so, jetzt auch mal registriert...)</p>
<p>Wollte noch ergaenzend sagen, dass die Werte dann ueber Netzwerk verschickt werden, und am anderen Ende wieder in die Klasse MyClass geladen werden. Und dann stimmen die Werte net...</p>
<p>Vlt kann ja jemand helfen <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/1121306</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1121306</guid><dc:creator><![CDATA[WetDreams]]></dc:creator><pubDate>Mon, 21 Aug 2006 09:07:49 GMT</pubDate></item><item><title><![CDATA[Reply to memcpy mit structs on Mon, 21 Aug 2006 09:09:33 GMT]]></title><description><![CDATA[<p>Such mal nach Padding, das sollte dir sagen, warums nicht geht (zumindest nicht so, wie du es haben willst) ;).<br />
Übrigens, die typedefs kannst du dir schenken, in C++ sind structs auch so echte Typnamen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1121308</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1121308</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Mon, 21 Aug 2006 09:09:33 GMT</pubDate></item><item><title><![CDATA[Reply to memcpy mit structs on Mon, 21 Aug 2006 09:10:19 GMT]]></title><description><![CDATA[<p>Mit der Addition von sizeof(HeadStruct) zu dem Zeiger auf MyStruct wanderst Du weit ins Nirvana - denn diese Addition bezieht sich nicht auf Bytes sondern auf MyStruct-Elemente. Davon ab dass dir das Padding hier noch einen Strich durch die Rechnung machen könnte müsstest Du vorher zu char* casten.</p>
<p>Warum nimmst Du nicht &amp;(A.MyStructInClass.e)?</p>
<p>Achja: Für Buffer ist kein Speicher reserviert <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/1121309</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1121309</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Mon, 21 Aug 2006 09:10:19 GMT</pubDate></item><item><title><![CDATA[Reply to memcpy mit structs on Mon, 21 Aug 2006 09:25:05 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich würde das auch nicht so machen, sondern ein &quot;anständiges&quot; Übertragungsformat definieren und die Dateninhalte einzeln übertragen (wie bei Java in serialize()).<br />
Damit bist Du auf jeden Fall unabhängiger und sicherer.<br />
In C++ brauchst Du daraus nicht mal eine Klasse zu machen, denn structs fürfen auch Funktionen haben.</p>
<pre><code class="language-cpp">struct MyStruct
{
    HeadStruct Head;
    long e;
    long f;
    long g;
    void body2SendFormat(char* szBuffer, size_t BufferLen, size_t&amp; outDataLen) 
    { // Was Du hier machst, ist egal, hauptsache umkehrbar .... 
    }
    void sendFormatBodyImport(char* szBuffer, size_t dataLen) { .... }
};
</code></pre>
<p>Natürlich kannst Du das Format auch außerhalb des Structs definieren (vA, wenn Du es noch für andere Datentypen verwenden willst...</p>
<p>Wenn Du es &quot;ganz schick in C++&quot; haben willst, kannst Du auch für Deinen Netzwerkstream &lt;&lt;- und &gt;&gt;-Operatoren überladen, die direkt Dein Struct übernehmen...</p>
<p>Ach ja: Über die &quot;Lebenszeit&quot; Deines Objekts musst Du Dir noch Gedanken machen !<br />
In Deinem Beispiel wird das Objekt vorher erzeugt und die Werte (besonders Head...) belegt. Wenn Du ein echtes &quot;Erzeugen aus den angelieferten Daten&quot; umsetzen willst, solltest Du ein wenig unter &quot;factory pattern&quot; nachlesen.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1121318</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1121318</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Mon, 21 Aug 2006 09:25:05 GMT</pubDate></item><item><title><![CDATA[Reply to memcpy mit structs on Mon, 21 Aug 2006 09:25:47 GMT]]></title><description><![CDATA[<p>Hmm...danke fuer die Tipps.</p>
<p>Das die Variablen nicht initialisiert sind ist klar, wollt das alles ein bissl abspecken und net verwirren...sry.</p>
<p>Das Problem ist, dass die structs so (unschoen) generiert werden, und ich mit denen arbeiten muss...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1121322</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1121322</guid><dc:creator><![CDATA[WetDreams]]></dc:creator><pubDate>Mon, 21 Aug 2006 09:25:47 GMT</pubDate></item><item><title><![CDATA[Reply to memcpy mit structs on Mon, 21 Aug 2006 09:33:07 GMT]]></title><description><![CDATA[<p>Hmm...ich glaub ich hab das was verstanden:</p>
<p>Dadurch, dass ich eine struct in einer struct habe, gibt es Padding-Bytes, die sizeof nicht angibt, bei memcpy aber ueberschrieben werden. Und deshalb verschieben sich die Werte...</p>
<p>...stimmt das <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1121326</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1121326</guid><dc:creator><![CDATA[WetDreams]]></dc:creator><pubDate>Mon, 21 Aug 2006 09:33:07 GMT</pubDate></item><item><title><![CDATA[Reply to memcpy mit structs on Mon, 21 Aug 2006 09:37:43 GMT]]></title><description><![CDATA[<p>Fast. Durch das Padding könnten Bytes zwischen das Headobjekt und die benötigten Daten geschoben werden (die aber von sizeof durchaus erfasst werden). Da du scheinbar nur die Größe des Headobjekts hast, hast du prinzipiell keine auf allen Maschinen gleich funktionierende Möglichkeit, den Anfang der echten Daten zu finden (und bekommst deshalb u.U. ziemlichen Myll).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1121333</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1121333</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Mon, 21 Aug 2006 09:37:43 GMT</pubDate></item><item><title><![CDATA[Reply to memcpy mit structs on Mon, 21 Aug 2006 09:46:03 GMT]]></title><description><![CDATA[<p>Hmm...hab jetzt schon einiges im Netz gelesen und frag mich, ob es denne eine Loesung gibt wenn man davon ausgeht, dass nur x86 benutzt wird?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1121340</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1121340</guid><dc:creator><![CDATA[WetDreams]]></dc:creator><pubDate>Mon, 21 Aug 2006 09:46:03 GMT</pubDate></item><item><title><![CDATA[Reply to memcpy mit structs on Mon, 21 Aug 2006 10:04:44 GMT]]></title><description><![CDATA[<p>Kaum, das ist nicht CPU sondern compilerabhängig. Kannst du an den Structs noch rummogeln? Dann könntest du folgendes machen (was allerdings ziemlich böse ist):</p>
<pre><code class="language-cpp">struct HeadStruct
{
  long a;
  long b;
  long c;
  long d;
};

struct MyStruct
{
  HeadStruct Head;
  char dummy;
  long e;
  long f;
  long g;
};

template &lt;typename MyStruct&gt;
class MyClass
{
  MyStruct MyStructInClass;
};

MyClass&lt;MyStruct&gt; A;
char* Buffer;
char* pDummy = reinterpret_cast&lt;char*&gt;(&amp;(A.MyStructInClass.dummy));
memcpy(Buffer, pDummy, sizeof(A.MyStructInClass) - (pDummy - reinterpret_cast&lt;char*&gt; (A.MyStructInClass)));
</code></pre>
<p>(Bin mir damit nicht ganz sicher). Besser wäre aber definitiv eine Serialisierung, wie Simon es vorschlug.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1121350</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1121350</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Mon, 21 Aug 2006 10:04:44 GMT</pubDate></item><item><title><![CDATA[Reply to memcpy mit structs on Mon, 21 Aug 2006 10:58:32 GMT]]></title><description><![CDATA[<p>Ok, here we go:</p>
<p>Wenn man den Compiler noch den Befehl /Zp1 (gibt es auch mit /Zp2, /Zp4, usw...), dann werden 1-Byte-Bounderies benutzt. Dadurch wird das padding vermieden, und alles ist im lot <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/1121385</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1121385</guid><dc:creator><![CDATA[WetDreams]]></dc:creator><pubDate>Mon, 21 Aug 2006 10:58:32 GMT</pubDate></item><item><title><![CDATA[Reply to memcpy mit structs on Mon, 21 Aug 2006 11:14:03 GMT]]></title><description><![CDATA[<p>Ist aber trotzdem unschön...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1121403</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1121403</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Mon, 21 Aug 2006 11:14:03 GMT</pubDate></item><item><title><![CDATA[Reply to memcpy mit structs on Mon, 21 Aug 2006 11:44:27 GMT]]></title><description><![CDATA[<p>WetDreams schrieb:</p>
<blockquote>
<p>Ok, here we go:</p>
<p>Wenn man den Compiler noch den Befehl /Zp1 (gibt es auch mit /Zp2, /Zp4, usw...), dann werden 1-Byte-Bounderies benutzt. Dadurch wird das padding vermieden, und alles ist im lot <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>Hi,</p>
<p>Du solltest aber nicht das Problem vergessen, dass dieser Weg unbrauchbar wird, z.B. weil<br />
- mal ein anderer Compiler benutzt wird (oder die neue Compiler-Version diese Option anders/nicht mehr unterstützt),<br />
- schreibender und lesender Code von unterschiedlichen Leuten (Gruppen, Firmen, ...) verfasst/gepflegt wird (die vllt. gar nicht diese Option nutzen können),<br />
- Du nächstes Jahr vllt. eine Bibliothek (für etwas ganz anderes) verwenden sollst/musst, die sich mit dieser Compilereinstellung beisst,<br />
- Bei der Analyse herauskommt, dass die Performance unszureichend ist und ein Alignment deutliche/notwendige Steigerungen auf der Plattform ergäbe,<br />
- ....</p>
<p>Natürlich kann man das auch auf sich zukommen lassen (&quot;Optimieren/Flexibilisieren erst dann, wenn die Notwendigkeit dazu besteht&quot; ist ja auch ein sinnvoller Grundsatz), aber es hilft dann später sehr, wenn man es jetzt zumindestens gründlich dokumentiert.<br />
Außerdem kommst Du damit später in &quot;Migrationsprobleme&quot; (was, wenn ClientSW oder Datenbestände mit dem alten Format bestehen, Du aber den Server auf das neue umstellen willst), die Du Dir jetzt evtl. sparen kannst...</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1121424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1121424</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Mon, 21 Aug 2006 11:44:27 GMT</pubDate></item></channel></rss>