<?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[Kopieren von std::aligned_storage::type definiert?]]></title><description><![CDATA[<p>Anhand folgendem Beispiel sieht man, dass es *möglich* ist eine Instanz von std::aligned_storage::type zu kopieren, ohne den verwalteten Speicher explizit zu kopieren. Anfangs dachte ich, dass sich std::aligned_storage::type äquivalent zu char[N] verhalten würde, das implizierte Kopieren also nicht möglich sei.</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;type_traits&gt;
#include &lt;cstring&gt;

int main() {
        typename std::aligned_storage&lt;sizeof(char) * 64, alignof(char)&gt;::type m;
        typename std::aligned_storage&lt;sizeof(char) * 64, alignof(char)&gt;::type n;

        std::memcpy(&amp;m, &quot;Hello World&quot;, 12);

        std::cout &lt;&lt; reinterpret_cast&lt;const char*&gt;(&amp;m) &lt;&lt; std::endl;

        n = m; // HIER

        std::cout &lt;&lt; reinterpret_cast&lt;const char*&gt;(&amp;n) &lt;&lt; std::endl;

        std::memcpy(&amp;m, &quot;123456&quot;, 7);

        std::cout &lt;&lt; reinterpret_cast&lt;const char*&gt;(&amp;m) &lt;&lt; std::endl;
        std::cout &lt;&lt; reinterpret_cast&lt;const char*&gt;(&amp;n) &lt;&lt; std::endl;

        return 0;
}
</code></pre>
<p>Resultat: <a href="http://ideone.com/42WVPY" rel="nofollow">http://ideone.com/42WVPY</a></p>
<p>Ist das Kopieren eines std::aligned_storage undefiniertes Verhalten (in obigem Fall also nur Zufall, dass das erwartete Ergebnis eintrifft) oder korrekt?</p>
<p>Ich sehe gerade, dass type ein struct ist, welches den Speicher kapselt. Nutze ich bei der Zuweisung &quot;n = m&quot; nun also den default operator=() dieses anonymen structs?</p>
<pre><code>template&lt;std::size_t Len, std::size_t Align&gt;
struct aligned_storage {
    typedef struct {
        alignas(Align) unsigned char data[Len];
    } type;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/310424/kopieren-von-std-aligned_storage-type-definiert</link><generator>RSS for Node</generator><lastBuildDate>Tue, 04 Aug 2026 19:22:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/310424.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 11 Nov 2012 13:01:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Kopieren von std::aligned_storage::type definiert? on Sun, 11 Nov 2012 13:01:35 GMT]]></title><description><![CDATA[<p>Anhand folgendem Beispiel sieht man, dass es *möglich* ist eine Instanz von std::aligned_storage::type zu kopieren, ohne den verwalteten Speicher explizit zu kopieren. Anfangs dachte ich, dass sich std::aligned_storage::type äquivalent zu char[N] verhalten würde, das implizierte Kopieren also nicht möglich sei.</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;type_traits&gt;
#include &lt;cstring&gt;

int main() {
        typename std::aligned_storage&lt;sizeof(char) * 64, alignof(char)&gt;::type m;
        typename std::aligned_storage&lt;sizeof(char) * 64, alignof(char)&gt;::type n;

        std::memcpy(&amp;m, &quot;Hello World&quot;, 12);

        std::cout &lt;&lt; reinterpret_cast&lt;const char*&gt;(&amp;m) &lt;&lt; std::endl;

        n = m; // HIER

        std::cout &lt;&lt; reinterpret_cast&lt;const char*&gt;(&amp;n) &lt;&lt; std::endl;

        std::memcpy(&amp;m, &quot;123456&quot;, 7);

        std::cout &lt;&lt; reinterpret_cast&lt;const char*&gt;(&amp;m) &lt;&lt; std::endl;
        std::cout &lt;&lt; reinterpret_cast&lt;const char*&gt;(&amp;n) &lt;&lt; std::endl;

        return 0;
}
</code></pre>
<p>Resultat: <a href="http://ideone.com/42WVPY" rel="nofollow">http://ideone.com/42WVPY</a></p>
<p>Ist das Kopieren eines std::aligned_storage undefiniertes Verhalten (in obigem Fall also nur Zufall, dass das erwartete Ergebnis eintrifft) oder korrekt?</p>
<p>Ich sehe gerade, dass type ein struct ist, welches den Speicher kapselt. Nutze ich bei der Zuweisung &quot;n = m&quot; nun also den default operator=() dieses anonymen structs?</p>
<pre><code>template&lt;std::size_t Len, std::size_t Align&gt;
struct aligned_storage {
    typedef struct {
        alignas(Align) unsigned char data[Len];
    } type;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2269793</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2269793</guid><dc:creator><![CDATA[aligned_storage]]></dc:creator><pubDate>Sun, 11 Nov 2012 13:01:35 GMT</pubDate></item><item><title><![CDATA[Reply to Kopieren von std::aligned_storage::type definiert? on Sun, 11 Nov 2012 14:38:37 GMT]]></title><description><![CDATA[<p>Gute Frage.</p>
<p>Der C++ Standard sagt nur, dass der Typ ein &quot;POD type&quot; ist. Ein &quot;POD type&quot; ist entweder ein &quot;scalar type&quot;, ein &quot;POD class&quot;, ein Array von solchen Typen sowie cv-qualifizierte Versionen davon. [§3.9/9]</p>
<p>Weil hier ein Array erlaubt ist, heißt das also, dass du dich nicht darauf verlassen kannst, dass das Ding kopierbar oder zuweisbar ist. Undefiniert ist das Verhalten hier nicht. Aber es ist nicht garantiert, dass Dein Code compiliert, weil ja ein rohes Array keinen Zuweisungsoperator bietet, z.B.</p>
<p>Andererseits wird in einer Bemerkung erwähnt, dass eine &quot;typische Implementierung&quot; hier ein &quot;POD class&quot;-Typ verwendet. [§20.9.7.6/1]</p>
<p>Das ist also ein bisschen unterspezifiziert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2269819</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2269819</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 11 Nov 2012 14:38:37 GMT</pubDate></item><item><title><![CDATA[Reply to Kopieren von std::aligned_storage::type definiert? on Sun, 11 Nov 2012 15:55:19 GMT]]></title><description><![CDATA[<p>Danke für die aufschlussreiche Antwort.<br />
Ich denke, dass ich trotz der Möglichkeit weiterhin von der &quot;einfachen Zuweisung&quot; Gebrauch machen werde. Ist schlicht und ergreifend lesbarer. Falls mir mal ein Compiler mit abweichender Implementierung in die Finger kommen sollte, habe ich ja dann immer noch die Option den verwalteten Speicher explizit via memcpy zu kopieren.</p>
<p>Noch einmal vielen Dank, krümelkacker. <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/2269847</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2269847</guid><dc:creator><![CDATA[aligned_storage]]></dc:creator><pubDate>Sun, 11 Nov 2012 15:55:19 GMT</pubDate></item></channel></rss>