<?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[aliasing und alignment]]></title><description><![CDATA[<p>Hi,</p>
<p>ich suche nach einem Weg auf den Wert von Objekten über beliebige (POD) Typen zuzugreifen. Da ich eigentlich dachte, dass die Frage toll ins Q/A Format passt, habe ich sie auf <a href="http://stackoverflow.com/questions/9964418/strict-aliasing-and-alignment" rel="nofollow">Stackoverflow</a> gestellt. Da da bis jetzt aber noch nicht sehr viel bei rumgekommen ist, crossposte ich sie mal hier. Vielleicht interessiert es ja jemanden. <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/topic/301678/aliasing-und-alignment</link><generator>RSS for Node</generator><lastBuildDate>Tue, 11 Aug 2026 18:28:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/301678.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 01 Apr 2012 14:54:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to aliasing und alignment on Sun, 01 Apr 2012 14:54:31 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich suche nach einem Weg auf den Wert von Objekten über beliebige (POD) Typen zuzugreifen. Da ich eigentlich dachte, dass die Frage toll ins Q/A Format passt, habe ich sie auf <a href="http://stackoverflow.com/questions/9964418/strict-aliasing-and-alignment" rel="nofollow">Stackoverflow</a> gestellt. Da da bis jetzt aber noch nicht sehr viel bei rumgekommen ist, crossposte ich sie mal hier. Vielleicht interessiert es ja jemanden. <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/2197668</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197668</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sun, 01 Apr 2012 14:54:31 GMT</pubDate></item><item><title><![CDATA[Reply to aliasing und alignment on Sun, 01 Apr 2012 16:17:31 GMT]]></title><description><![CDATA[<p>Warum nicht einfach <code>reinterpret_cast</code> ? Ist zwar nicht erlaubt, funktioniert in der Praxis aber.<br />
Wozu soll das überhaupt gut sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197694</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197694</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Sun, 01 Apr 2012 16:17:31 GMT</pubDate></item><item><title><![CDATA[Reply to aliasing und alignment on Sun, 01 Apr 2012 16:36:53 GMT]]></title><description><![CDATA[<p>TyRoXx schrieb:</p>
<blockquote>
<p>Warum nicht einfach <code>reinterpret_cast</code> ? Ist zwar nicht erlaubt, funktioniert in der Praxis aber.</p>
</blockquote>
<p>Weil es nicht erlaubt ist. &quot;Funktioniert in der Praxis aber&quot; ist der letzte Weg, bevor ich den gehe, will ich wirklich sicher sein.</p>
<p>Wozu das gut sein soll? Na ja, z.B. wenn eine Funktion ein void* möchte um das nachher weiterzucasten, aber nicht auf char* ausweichen will, sondern z.B. in ints weiterrechnet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197702</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197702</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sun, 01 Apr 2012 16:36:53 GMT</pubDate></item><item><title><![CDATA[Reply to aliasing und alignment on Sun, 01 Apr 2012 17:54:25 GMT]]></title><description><![CDATA[<p>Ist dein C-Style-Cast nicht auch ein <code>reinterpret_cast&lt;&gt;</code> ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197723</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197723</guid><dc:creator><![CDATA[kpler]]></dc:creator><pubDate>Sun, 01 Apr 2012 17:54:25 GMT</pubDate></item><item><title><![CDATA[Reply to aliasing und alignment on Sun, 01 Apr 2012 18:07:01 GMT]]></title><description><![CDATA[<p>kpler schrieb:</p>
<blockquote>
<p>Ist dein C-Style-Cast nicht auch ein <code>reinterpret_cast&lt;&gt;</code> ?</p>
</blockquote>
<p>Guter Punkt. <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 />
Wie den Kommentaren zu entnehmen ist, spuckt der GCC ja auch hier keine Warnung mehr aus. <a href="http://ideone.com/GBhqV" rel="nofollow">http://ideone.com/GBhqV</a><br />
Auch scheint nur der alte C Compiler das überhaupt auszunutzen, und auch da komisch: <a href="http://ideone.com/w3CI0" rel="nofollow">http://ideone.com/w3CI0</a></p>
<p>Alles sehr eigenartig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197729</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197729</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sun, 01 Apr 2012 18:07:01 GMT</pubDate></item><item><title><![CDATA[Reply to aliasing und alignment on Mon, 02 Apr 2012 00:38:58 GMT]]></title><description><![CDATA[<p>lol jetzt ist er sogar bei reddit</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197811</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197811</guid><dc:creator><![CDATA[gehts noch?]]></dc:creator><pubDate>Mon, 02 Apr 2012 00:38:58 GMT</pubDate></item><item><title><![CDATA[Reply to aliasing und alignment on Mon, 02 Apr 2012 08:03:17 GMT]]></title><description><![CDATA[<p>Folgendes Code-Beispiel:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

struct Test {
  int i;
  short s;
};

int main() {
  int i;
  float f = 3.11313;
  i = *(int*)&amp;f;
  i = *reinterpret_cast&lt;int*&gt;(&amp;f);

  int test[] = {1, 0};
  Test test2 = *reinterpret_cast&lt;Test*&gt;(test);
  std::cout &lt;&lt; i &lt;&lt; std::endl;
  std::cout &lt;&lt; f &lt;&lt; std::endl;
  std::cout &lt;&lt; test2.i &lt;&lt; std::endl;
}
</code></pre>
<p>Gibt bei mir diese Warnungen:</p>
<pre><code>./test.cpp: In Funktion »int main()«:
./test.cpp:13:15: Warnung: Dereferenzierung eines Type-Pun-Zeigers verletzt strict-aliasing-Regeln [-Wstrict-aliasing]
./test.cpp:14:33: Warnung: Dereferenzierung eines Type-Pun-Zeigers verletzt strict-aliasing-Regeln [-Wstrict-aliasing]
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2197846</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197846</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Mon, 02 Apr 2012 08:03:17 GMT</pubDate></item><item><title><![CDATA[Reply to aliasing und alignment on Mon, 02 Apr 2012 09:22:55 GMT]]></title><description><![CDATA[<p>Die Interpretation von 3.10/10 scheint nicht sonderlich einheitlich zu sein, wahrscheinlich (und hoffentlich) wird das umgeschrieben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197883</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197883</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Mon, 02 Apr 2012 09:22:55 GMT</pubDate></item><item><title><![CDATA[Reply to aliasing und alignment on Mon, 02 Apr 2012 09:44:35 GMT]]></title><description><![CDATA[<p>Was ist daran denn missverständlich? Es gibt laut Standard keinen definierten Weg um zu erreichen was du willst (zumindest afaik), außer evtl. einem memcpy() über einen char Buffer oder sowas (vorausgesetzt der char Buffer ist passend aligned etc). Das Ergebnis wird in der Regel aber wohl bestenfalls implementation defined sein.</p>
<p>Nachdem ja schon nichtmal die exakte Größe eines simplen int definiert ist, ist mir auch nicht klar wie man das im Standard lösen sollte. Was genau sollte man da deiner Meinung nach umschreiben? Diese Regel ist sehr wichtig für die Performance des erzeugten Code, die einfach umzuschreiben ist nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197887</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197887</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Mon, 02 Apr 2012 09:44:35 GMT</pubDate></item><item><title><![CDATA[Reply to aliasing und alignment on Mon, 02 Apr 2012 09:51:04 GMT]]></title><description><![CDATA[<p>dot schrieb:</p>
<blockquote>
<p>memcpy()</p>
</blockquote>
<p>Sobald memcpy im Spiel ist, ist das Ganze eh vorbei, weil man dann auch einfach in einen std::vector&lt;T&gt; oder T[] oder sonst was kopieren kann, ab dem Punkt interessiert sich niemand mehr für aliasing oder alignment. Da braucht man auch keinen char Puffer zwischenzulegen. <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>Was daran nicht eindeutig ist? Na ja, ich habe hierzu bis jetzt vier Interpretationen hierzu, (wenn man alignment ignoriert und sich nur auf strict aliasing bezieht)<br />
Deiner Meinung nach ist alles illegal?</p>
<pre><code class="language-cpp">#include &lt;new&gt;

int main()
{
  short buf[sizeof(double)];
  double d;

  buf[0] = 2; // accessed as short

  *(double*)buf = 345.465;
  d = *(double*)buf;

  double* d1 = reinterpret_cast&lt;double*&gt;(buf);
  *d1 = 32.234;
  d = *d1;

  double* d2 = new (buf) double;
  *d2 = 42.0323;
  d = *d2;
}
</code></pre>
<p>Und was wäre mit einem char Puffer? Laut 3.10/10</p>
<blockquote>
<p>If a program attempts to access the stored value of an object through a glvalue of other than one of the following types the behavior is undefined</p>
<p>...<br />
— a char or unsigned char type.</p>
</blockquote>
<p>Das schließt so eigentlich nicht mit ein, dass char[]s eine besondere Bedeutung bekommen. Der Weg funktioniert nur umgekehrt? Aber hey, wie soll placement new dann funktionieren? So wie ich das sehe, muss spätestens placement new ein neues Objekt einführen können.</p>
<p>Und dass die Typen keine festen Größen haben hat eigentlich wenig mit aliasing zu tun, vielleicht noch mit alignment, aber auch daran scheint man in C++11 ja interessiert zu sein, was sich durch Dinge wie &quot;alignof&quot;, &quot;std::aligned_union&quot; und &quot;std::aligned_storage&quot; zeigt.</p>
<p>dot schrieb:</p>
<blockquote>
<p>Was genau sollte man da deiner Meinung nach umschreiben? Diese Regel ist sehr wichtig für die Performance des erzeugten Code,</p>
</blockquote>
<p>Das das Argument höre ich immer wieder. Aber wie wichtig kann die Regel schon sein, wenn weder VS noch GCC sie richtig durchziehen? VS ignoriert das scheinbar ganz, und der GCC packt gerade mal ne halbherzige Warnung raus. (Und auch das ziemlich unzuverlässig.) Die einzige Version, die ich dazu bringen konnte das wirklich auszunutzen, ist der 4.3.4 C Compiler.</p>
<p>dot schrieb:</p>
<blockquote>
<p>die einfach umzuschreiben ist nicht.</p>
</blockquote>
<p>Mit einfach umschreiben meine ich nicht unbedingt strict aliasing aufzugeben. Aber die Regeln eindeutig machen. Was ist mit malloc() z.B.? Hier muss eindeutig Klarheit geschaffen werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197896</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197896</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Mon, 02 Apr 2012 09:51:04 GMT</pubDate></item><item><title><![CDATA[Reply to aliasing und alignment on Mon, 02 Apr 2012 10:08:56 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>dot schrieb:</p>
<blockquote>
<p>memcpy()</p>
</blockquote>
<p>Sobald memcpy im Spiel ist, ist das Ganze eh vorbei, weil man dann auch einfach in einen std::vector&lt;T&gt; oder T[] oder sonst was kopieren kann, ab dem Punkt interessiert sich niemand mehr für aliasing oder alignment.</p>
</blockquote>
<p>Also wenn du mich fragst, dann interessiert das dort sehr wohl...</p>
<p>cooky451 schrieb:</p>
<blockquote>
<p>Was daran nicht eindeutig ist? Na ja, ich habe hierzu bis jetzt vier Interpretationen hierzu, (wenn man alignment ignoriert und sich nur auf strict aliasing bezieht)<br />
Deiner Meinung nach ist alles illegal?</p>
<pre><code class="language-cpp">#include &lt;new&gt;

int main()
{
  short buf[sizeof(double)];
  double d;
  
  buf[0] = 2; // accessed as short
  
  *(double*)buf = 345.465;
  d = *(double*)buf;
 
  double* d1 = reinterpret_cast&lt;double*&gt;(buf);
  *d1 = 32.234;
  d = *d1;
 
  double* d2 = new (buf) double;
  *d2 = 42.0323;
  d = *d2;
}
</code></pre>
</blockquote>
<p>Varianten 1 und 2 sind gleichwertig und beide undefiniert. Der Zugriff verletzt definitiv §3.10/10. Ich seh nicht, wo es da Spielraum für irgendwelche &quot;Interpretationen&quot; gibt; der Standard sagt klipp und klar dass das undefiniert ist.<br />
Das buf[0] = 2 ist ok und die Variante mit placement new ebenfalls (vorausgesetzt buf ist richtig aligned).<br />
Der Inhalt von buf ist im letzten Fall aber implementation defined.</p>
<p>EDIT: Ok, das mit dem placement new ist in der Tat interessant. Ich würde jetzt mal sagen, dass du nach dem new nichtmehr auf buf zugreifen darfst.</p>
<p>cooky451 schrieb:</p>
<blockquote>
<p>Und was wäre mit einem char Puffer? Laut 3.10/10</p>
<blockquote>
<p>If a program attempts to access the stored value of an object through a glvalue of other than one of the following types the behavior is undefined</p>
<p>...<br />
— a char or unsigned char type.</p>
</blockquote>
<p>Das schließt so eigentlich nicht mit ein, dass char[]s eine besondere Bedeutung bekommen. Der Weg funktioniert nur umgekehrt? Aber hey, wie soll placement new dann funktionieren? So wie ich das sehe, muss spätestens placement new ein neues Objekts einführen können.</p>
</blockquote>
<p>Was hat das mit placement new zu tun? Die Regel sagt nur dass der Compiler davon ausgehen muss, dass über einen char Pointer jedes mögliche Objekt modifiziert werden kann. Wenn du dagegen einen float Pointer hast, muss der Compiler nur davon ausgehen, dass dadurch nur ein float modifiziert werden kann.</p>
<p>cooky451 schrieb:</p>
<blockquote>
<p>Und dass die Typen keine festen Größen haben hat eigentlich wenig mit aliasing zu tun, vielleicht noch mit alignment, aber auch daran scheint man in C++11 ja interessiert zu sein, was sich durch Dinge wie &quot;alignof&quot;, &quot;std::aligned_union&quot; und &quot;std::aligned_storage&quot; zeigt.</p>
</blockquote>
<p>Es hat nichts mit aliasing zu tun, aber es hat sehr viel damit zu run, wie der Inhalt von deinem char Buffer aussieht. Ich ging davon aus dass der Hintergrund deiner Frage war, einen portablen und wohldefinierten Weg zu finden, um mit den Bytes von Objekten rumzuspielen. Den gibt es aber einfach nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197900</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197900</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Mon, 02 Apr 2012 10:08:56 GMT</pubDate></item><item><title><![CDATA[Reply to aliasing und alignment on Mon, 02 Apr 2012 10:15:18 GMT]]></title><description><![CDATA[<p>dot schrieb:</p>
<blockquote>
<p>Was hat das mit placement new zu tun?</p>
</blockquote>
<p>Was ich damit halt ausdrücken wollte war, dass es irgendeinen Weg geben muss Objekte zu &quot;aliasen&quot;, und char[]s eigentlich keine Ausnahme sein können. (Was dann wieder dazu führt, dass man rein von der aliasing Regel her betrachtet eigentlich alle <s>PODs</s> Typen austauschen können muss.)</p>
<p>Und malloc() gibts ja auch noch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197910</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197910</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Mon, 02 Apr 2012 10:15:18 GMT</pubDate></item><item><title><![CDATA[Reply to aliasing und alignment on Mon, 02 Apr 2012 10:21:33 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>dot schrieb:</p>
<blockquote>
<p>Was hat das mit placement new zu tun?</p>
</blockquote>
<p>Was ich damit halt ausdrücken wollte war, dass es irgendeinen Weg geben muss Objekte zu &quot;aliasen&quot;, und char[]s eigentlich keine Ausnahme sein können. (Was dann wieder dazu führt, dass man rein von der aliasing Regel her betrachtet eigentlich alle <s>PODs</s> Typen austauschen können muss.)</p>
</blockquote>
<p>Wo liest du denn das? Wenn du mich fragst sagt §3.10/10 ziemlich unmissverständlich und zweifelsfrei das genaue Gegenteil von dem was du da sagst. So wie ich das verstehe, steht dort: Alles außer char oder dem richtigen Typ macht bumm.</p>
<p>cooky451 schrieb:</p>
<blockquote>
<p>Und malloc() gibts ja auch noch.</p>
</blockquote>
<p>Ja, das returned einen void*...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197911</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197911</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Mon, 02 Apr 2012 10:21:33 GMT</pubDate></item><item><title><![CDATA[Reply to aliasing und alignment on Mon, 02 Apr 2012 10:59:36 GMT]]></title><description><![CDATA[<p>dot schrieb:</p>
<blockquote>
<p>Wo liest du denn das? Wenn du mich fragst sagt §3.10/10 ziemlich unmissverständlich und zweifelsfrei das genaue Gegenteil von dem was du da sagst.</p>
</blockquote>
<p>Der Gedankengang ist folgender:<br />
- placement new muss irgendwie funktionieren (zumindest mit char[]s)<br />
- +<br />
- char[]s kommen aber keine besondere Bedeutung zu<br />
- =<br />
- ? <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>
<p>cooky451 schrieb:</p>
<blockquote>
<p>Und malloc() gibts ja auch noch.<br />
Ja, das returned einen void*...</p>
</blockquote>
<p>Ja, schon. Aber ein cast nach void* erlaubt ja nicht plötzlich alles. Wird also magisch der erste Cast genommen? Oder die erste Dereferenzierung? (Was ist wenn man auf den Speicher später noch mal über einen anderen Typen zugreift.)</p>
<p>Und wie siehts hiermit aus?</p>
<pre><code class="language-cpp">#include &lt;new&gt;

int main()
{
  short buf[sizeof(double) * 2];

  double* d1 = new (buf) double;
  d1[1] = 2.345;
  double d = d1[1];
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2197915</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197915</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Mon, 02 Apr 2012 10:59:36 GMT</pubDate></item><item><title><![CDATA[Reply to aliasing und alignment on Mon, 02 Apr 2012 11:03:30 GMT]]></title><description><![CDATA[<p><a href="http://dbp-consulting.com/tutorials/StrictAliasing.html#toc_link10" rel="nofollow">http://dbp-consulting.com/tutorials/StrictAliasing.html#toc_link10</a><br />
memcpy version, compliant to C and C++ specs and efficient</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197923</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197923</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Mon, 02 Apr 2012 11:03:30 GMT</pubDate></item><item><title><![CDATA[Reply to aliasing und alignment on Mon, 02 Apr 2012 11:10:01 GMT]]></title><description><![CDATA[<p>Wie gesagt, sobald memcpy ins Spiel kommt wird das ganze völlig uninteressant.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197927</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197927</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Mon, 02 Apr 2012 11:10:01 GMT</pubDate></item><item><title><![CDATA[Reply to aliasing und alignment on Mon, 02 Apr 2012 11:33:39 GMT]]></title><description><![CDATA[<p>Wieso? Willst du nicht einfach die Bytes der Objekte lesen / schreiben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197938</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197938</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Mon, 02 Apr 2012 11:33:39 GMT</pubDate></item><item><title><![CDATA[Reply to aliasing und alignment on Mon, 02 Apr 2012 12:09:50 GMT]]></title><description><![CDATA[<p>pyhax schrieb:</p>
<blockquote>
<p>Wieso? Willst du nicht einfach die Bytes der Objekte lesen / schreiben?</p>
</blockquote>
<p>Es geht darum, auf einen Speicherbereich so zuzugreifen &quot;als wären es&quot; [typ]. Das schließt kopieren nicht mit ein, dann hat das keinen Sinn mehr. Dann ist es wahrscheinlich sogar performanter einfach char* zu nehmen. <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 />
(Und selbst wenn memcpy performanter sein sollte, das gehört irgendwie überhaupt nicht zum Thema. Natürlich funktioniert memcpy. Nie hat jemand etwas anderes behauptet.))</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197940</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197940</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Mon, 02 Apr 2012 12:09:50 GMT</pubDate></item><item><title><![CDATA[Reply to aliasing und alignment on Mon, 02 Apr 2012 12:02:05 GMT]]></title><description><![CDATA[<p>Folgende Idee:</p>
<pre><code class="language-cpp">template &lt;typename T, typename U&gt;
T&amp; binary_cast(U&amp; v)
{
    static_assert(std::is_trivially_copy_constructible&lt;T&gt;::value);
    static_assert(std::is_trivially_copy_constructible&lt;U&gt;::value);

    static_assert(sizeof(T) &lt;= sizeof v);

    std::memmove( &amp;reinterpret_cast&lt;T&amp;&gt;(v), &amp;v, sizeof(T) );
    return reinterpret_cast&lt;T&amp;&gt;(v);
}
</code></pre>
<p>könnte funktionieren, wegen 3.9/2 - und weil an die gleiche Stelle gemoved wird, kann man hoffen, dass der Compiler das wegoptimiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197945</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197945</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 02 Apr 2012 12:02:05 GMT</pubDate></item><item><title><![CDATA[Reply to aliasing und alignment on Mon, 02 Apr 2012 12:15:56 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>pyhax schrieb:</p>
<blockquote>
<p>Wieso? Willst du nicht einfach die Bytes der Objekte lesen / schreiben?</p>
</blockquote>
<p>Es geht darum, auf einen Speicherbereich so zuzugreifen &quot;als wären es&quot; [typ].</p>
</blockquote>
<p>Das geht nicht, end of story.</p>
<p>camper schrieb:</p>
<blockquote>
<p>[...] könnte funktionieren, wegen 3.9/2 - und weil an die gleiche Stelle gemoved wird, kann man hoffen, dass der Compiler das wegoptimiert.</p>
</blockquote>
<p>§3.9/2 garantiert aber doch auch nur, dass die Bytes beim zurückkopieren wieder den gleichen Wert ergeben und nicht wie die Bytes aussehen!?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197949</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197949</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Mon, 02 Apr 2012 12:15:56 GMT</pubDate></item><item><title><![CDATA[Reply to aliasing und alignment on Mon, 02 Apr 2012 12:16:49 GMT]]></title><description><![CDATA[<p>dot schrieb:</p>
<blockquote>
<p>Das geht nicht, end of story.</p>
</blockquote>
<p>Verstehe ich nicht. Du hast doch oben selbst geschrieben, dass es mit placement new funktioniert. Was denn jetzt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197951</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197951</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Mon, 02 Apr 2012 12:16:49 GMT</pubDate></item><item><title><![CDATA[Reply to aliasing und alignment on Mon, 02 Apr 2012 12:29:07 GMT]]></title><description><![CDATA[<p>Placement new konstruiert ein Objekt, das ist alles. Wo genau hab ich denn geschrieben dass du damit auf definierte Art und Weise ein Objekt als von anderem Typ interpretieren kannst!?<br />
Wie gesagt, selbst das Speicherabbild von trivialen Typen wie double ist implementation defined. Was du vorhast kann also rein prinzipiell schon nicht allgemein gehen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197957</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197957</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Mon, 02 Apr 2012 12:29:07 GMT</pubDate></item><item><title><![CDATA[Reply to aliasing und alignment on Mon, 02 Apr 2012 12:41:43 GMT]]></title><description><![CDATA[<p>dot schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>[...] könnte funktionieren, wegen 3.9/2 - und weil an die gleiche Stelle gemoved wird, kann man hoffen, dass der Compiler das wegoptimiert.</p>
</blockquote>
<p>§3.9/2 garantiert aber doch auch nur, dass die Bytes beim zurückkopieren wieder den gleichen Wert ergeben und nicht wie die Bytes aussehen!?</p>
</blockquote>
<p>Betrachte</p>
<pre><code class="language-cpp">int main()
{
    short x[2] = { 42, 43 };
    int y;
    memcpy( &amp;y, &amp;x, sizeof y);
    cout &lt;&lt; y &lt;&lt; '\n';
}
</code></pre>
<p>gibt mir irgendeine Zahl z aus.<br />
(Annahme: sizeof(short[2])==sizeof(int))</p>
<pre><code class="language-cpp">int main()
{
    int y;
    cin &gt;&gt; y;
    short x[2];
    memcpy( &amp;x, &amp;y, sizeof x );
    cout &lt;&lt; x[0] &lt;&lt; ',' &lt;&lt; x[1] &lt;&lt; '\n';
}
</code></pre>
<p>Gebe ich hier das obige Ergebnis ein, erwarte ich als Ausgabe 42,43. Man kann es dem einzelnen memcpy ja nicht ansehen, ob es nun das ursprüngliche memcpy ist, oder das, das zum Rückkopieren dient. Das kann dann aber nur funktionieren, wenn ein einfaches memcpy bereits alle Typinformationen (auch in Hinblick auf das Aliasproblem in 3.10/10) des Ursprungsobjektes vernichtet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197962</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197962</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 02 Apr 2012 12:41:43 GMT</pubDate></item><item><title><![CDATA[Reply to aliasing und alignment on Mon, 02 Apr 2012 12:51:01 GMT]]></title><description><![CDATA[<p>Mir ist nicht ganz klar worauf du hinaus willst. Dass das in der Praxis funktioniert bezweifle ich nicht. Mir geht es darum dass es keinen allgemein gültigen Weg gibt um die Bytes eines Objektes als die eines Objektes von anderem Typ umzuinterpretieren, der laut Standard auf allen möglichen Implementierungen genau das gleiche, definierte Verhalten produzieren wird (und rein prinzipiell schon nicht geben kann).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197963</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197963</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Mon, 02 Apr 2012 12:51:01 GMT</pubDate></item><item><title><![CDATA[Reply to aliasing und alignment on Mon, 02 Apr 2012 13:04:22 GMT]]></title><description><![CDATA[<p>dot schrieb:</p>
<blockquote>
<p>Placement new konstruiert ein Objekt, das ist alles. Wo genau hab ich denn geschrieben dass du damit auf definierte Art und Weise ein Objekt als von anderem Typ interpretieren kannst!?</p>
</blockquote>
<p>**<br />
Du hast geschrieben, dass das</p>
<blockquote>
<p>Es geht darum, auf einen Speicherbereich so zuzugreifen &quot;als wären es&quot; [typ].</p>
</blockquote>
<p>nicht geht.* Was macht placement new denn anderes? Es packt sich den Speicherbereich und du kannst hinterher drauf zugreifen, als wäre es [typ]. Solange das also nicht UB ist (was irgendwie Quatsch wäre), muss das doch funktionieren?</p>
<p>* Also dass man das mit char* darf ist ja klar, aber darum geht es ja nicht.</p>
<p>**</p>
<p>dot schrieb:</p>
<blockquote>
<p>Das buf[0] = 2 ist ok und die Variante mit placement new ebenfalls (vorausgesetzt buf ist richtig aligned).</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2197965</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197965</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Mon, 02 Apr 2012 13:04:22 GMT</pubDate></item><item><title><![CDATA[Reply to aliasing und alignment on Mon, 02 Apr 2012 12:57:39 GMT]]></title><description><![CDATA[<p>dot schrieb:</p>
<blockquote>
<p>Mir ist nicht ganz klar worauf du hinaus willst. Dass das in der Praxis funktioniert bezweifle ich nicht. Mir geht es darum dass es keinen allgemein gültigen Weg gibt um die Bytes eines Objektes als die eines Objektes von anderem Typ umzuinterpretieren, der laut Standard auf allen möglichen Implementierungen genau das gleiche, definierte Verhalten produzieren wird (und rein prinzipiell schon nicht geben kann).</p>
</blockquote>
<p>Das mag so sein. Allerdings ist da auch nicht das Problem des OT. Mal agesehen davon, dass es schwierig sein wird, verschiedene Objekte auf verschiedenen Plattformen als dem gleichen Typ zugehörig zu identifizieren.<br />
Soweit ich es verstehe, ging es darum, auf <em>einem einzigen</em> System eine solche Konvertierung durchzuführen - ggf. mit der Maßgabe, dass der interne Aufbau (Repräsentation) der Typen bekannt ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197966</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197966</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 02 Apr 2012 12:57:39 GMT</pubDate></item></channel></rss>