<?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[Wo liegt der Fehler?]]></title><description><![CDATA[<p>Hoi,<br />
ich wollte mal die Performance von einer trivialen Eigenimplementierung und std::memset testen.</p>
<pre><code class="language-cpp">#include &lt;cstring&gt;
#include &lt;cstdint&gt;
#include &lt;iostream&gt;

template&lt;typename IntegerT&gt;
void memset_impl(IntegerT* ptr, IntegerT value, std::size_t num)
{
    for(IntegerT* end = ptr + num; ptr != end; ++ptr)
        *ptr = value;
}

void my_memset(void* ptr, std::uint8_t value, std::size_t num)
{
    std::uint8_t* data = static_cast&lt;std::uint8_t*&gt;(ptr);

    if(num &lt;= sizeof(std::uint64_t) * 2)
    {
        memset_impl&lt;std::uint8_t&gt;(data, value, num);
    }
    else
    {
        std::size_t rest = num % sizeof(std::uint64_t);
        if(rest)
        {
            memset_impl&lt;std::uint8_t&gt;(data, value, rest);
            num -= rest;
            data += rest;
        }

        std::uint64_t pattern;
        auto pattern_ptr = reinterpret_cast&lt;std::uint8_t*&gt;(&amp;pattern);
        memset_impl&lt;std::uint8_t&gt;(pattern_ptr, value, sizeof(pattern));

        auto new_ptr = reinterpret_cast&lt;std::uint64_t*&gt;(data);
        memset_impl&lt;std::uint64_t&gt;(new_ptr, pattern,
            num / sizeof(std::uint64_t));
    }
}

int main()
{
    char* huge = new char[50];
    my_memset(huge, '*', 49);
    huge[49] = 0;
    std::cout &lt;&lt; huge;
}
</code></pre>
<p>Der GCC macht mit O0, O1, O2 keine Probleme, bei O3 kracht es aber. Mit Debug-Ausgaben in memset_impl nichtmal dann.<br />
Bin gerade hundemüde, warscheinlich ist es etwas Triviales, aber wo erzeuge ich UB?</p>
<p>Debuggen hat mir nicht wirklich etwas gebracht. Fliegt bei einem</p>
<pre><code class="language-asm">movdqa %xmm0,(%rcx)
</code></pre>
<p>in die Luf, dh. wenn der Compiler eigenständig XMM verwendet.</p>
<p>Danke &amp; Grüße,<br />
Ethon</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/299809/wo-liegt-der-fehler</link><generator>RSS for Node</generator><lastBuildDate>Thu, 13 Aug 2026 01:47:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/299809.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 19 Feb 2012 00:21:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wo liegt der Fehler? on Sun, 19 Feb 2012 00:21:37 GMT]]></title><description><![CDATA[<p>Hoi,<br />
ich wollte mal die Performance von einer trivialen Eigenimplementierung und std::memset testen.</p>
<pre><code class="language-cpp">#include &lt;cstring&gt;
#include &lt;cstdint&gt;
#include &lt;iostream&gt;

template&lt;typename IntegerT&gt;
void memset_impl(IntegerT* ptr, IntegerT value, std::size_t num)
{
    for(IntegerT* end = ptr + num; ptr != end; ++ptr)
        *ptr = value;
}

void my_memset(void* ptr, std::uint8_t value, std::size_t num)
{
    std::uint8_t* data = static_cast&lt;std::uint8_t*&gt;(ptr);

    if(num &lt;= sizeof(std::uint64_t) * 2)
    {
        memset_impl&lt;std::uint8_t&gt;(data, value, num);
    }
    else
    {
        std::size_t rest = num % sizeof(std::uint64_t);
        if(rest)
        {
            memset_impl&lt;std::uint8_t&gt;(data, value, rest);
            num -= rest;
            data += rest;
        }

        std::uint64_t pattern;
        auto pattern_ptr = reinterpret_cast&lt;std::uint8_t*&gt;(&amp;pattern);
        memset_impl&lt;std::uint8_t&gt;(pattern_ptr, value, sizeof(pattern));

        auto new_ptr = reinterpret_cast&lt;std::uint64_t*&gt;(data);
        memset_impl&lt;std::uint64_t&gt;(new_ptr, pattern,
            num / sizeof(std::uint64_t));
    }
}

int main()
{
    char* huge = new char[50];
    my_memset(huge, '*', 49);
    huge[49] = 0;
    std::cout &lt;&lt; huge;
}
</code></pre>
<p>Der GCC macht mit O0, O1, O2 keine Probleme, bei O3 kracht es aber. Mit Debug-Ausgaben in memset_impl nichtmal dann.<br />
Bin gerade hundemüde, warscheinlich ist es etwas Triviales, aber wo erzeuge ich UB?</p>
<p>Debuggen hat mir nicht wirklich etwas gebracht. Fliegt bei einem</p>
<pre><code class="language-asm">movdqa %xmm0,(%rcx)
</code></pre>
<p>in die Luf, dh. wenn der Compiler eigenständig XMM verwendet.</p>
<p>Danke &amp; Grüße,<br />
Ethon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2182846</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2182846</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Sun, 19 Feb 2012 00:21:37 GMT</pubDate></item><item><title><![CDATA[Reply to Wo liegt der Fehler? on Sun, 19 Feb 2012 01:07:29 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<p>wo erzeuge ich UB?</p>
</blockquote>
<p>Hier:</p>
<pre><code class="language-cpp">auto new_ptr = reinterpret_cast&lt;std::uint64_t*&gt;(data);
</code></pre>
<p>Durch das data += rest; ist praktisch garantiert, dass data nicht richtig ausgerichtet ist. (Auch ohne das data+=rest müsste die Funktion selbst für die korrekte Ausrichtung sorgen, um allgemein einsetzbar zu sein).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2182852</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2182852</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 19 Feb 2012 01:07:29 GMT</pubDate></item><item><title><![CDATA[Reply to Wo liegt der Fehler? on Sun, 19 Feb 2012 00:56:07 GMT]]></title><description><![CDATA[<p>Eigentlich ist es drei Zeilen weiter unten:</p>
<pre><code class="language-cpp">auto new_ptr = reinterpret_cast&lt;std::uint64_t*&gt;(data);
</code></pre>
<p>Aber ansonsten so, wie camper es beschreibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2182855</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2182855</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sun, 19 Feb 2012 00:56:07 GMT</pubDate></item><item><title><![CDATA[Reply to Wo liegt der Fehler? on Sun, 19 Feb 2012 01:06:55 GMT]]></title><description><![CDATA[<p>err, ja, habe versehentlich die falsche Zeile kopiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2182856</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2182856</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 19 Feb 2012 01:06:55 GMT</pubDate></item><item><title><![CDATA[Reply to Wo liegt der Fehler? on Sun, 19 Feb 2012 16:03:30 GMT]]></title><description><![CDATA[<p>Danke für die Antworten. <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>
<blockquote>
<p>(Auch ohne das data+=rest müsste die Funktion selbst für die korrekte Ausrichtung sorgen, um allgemein einsetzbar zu sein).</p>
</blockquote>
<p>Das heißt wohl dass es nicht genügt rest einfach danach zu schreiben?<br />
Was wäre denn korrekt? Mit alignof eine &quot;Basis&quot; für uint64 finden, Bytes bis zu dieser Basis schreiben, möglichst viele uint64s schreiben und dann den Rest wieder byteweise?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2183058</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2183058</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Sun, 19 Feb 2012 16:03:30 GMT</pubDate></item><item><title><![CDATA[Reply to Wo liegt der Fehler? on Sun, 19 Feb 2012 16:05:02 GMT]]></title><description><![CDATA[<p>Genau das.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2183060</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2183060</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sun, 19 Feb 2012 16:05:02 GMT</pubDate></item></channel></rss>