<?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[loop unrolling durch inlining hier möglich?]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe folgende Klasse</p>
<pre><code>namespace
{
    class rl_list_traverser_t
    {

    public:

        explicit
        rl_list_traverser_t(rl_val_t traverse_list, std::string func_name)
            : traverse_list{ traverse_list }
            , func_name{ func_name }
        {
        }

        auto car()
            -&gt; rl_list_traverser_t&amp;
        {
            try
            {
                (*this).traverse_list = traverse_list.car();
            }
            catch(rl_unsupported_operation_t const&amp; e)
            {
                throw rl_ill_formed_list_error_t{ (*this).func_name };
            }

            return (*this);
        }

        auto cdr()
            -&gt; rl_list_traverser_t&amp;
        {
            try
            {
                (*this).traverse_list = traverse_list.cdr();
            }
            catch(rl_unsupported_operation_t const&amp; e)
            {
                throw rl_ill_formed_list_error_t{ (*this).func_name };
            }

            return (*this);
        }

        auto get_list()
            -&gt; rl_val_t
        {
            return traverse_list;
        }

    private:

        rl_val_t traverse_list;
        std::string func_name;

    }; 
}
</code></pre>
<p>Diese wird wie folgt verwendet:</p>
<pre><code>auto rl_lisp_cddddr(rl_val_array_t args)
    -&gt; rl_val_array_t
{    
    return { rl_list_traverser_t{ args[0], &quot;cddddr&quot; }
        .cdr()
        .cdr()
        .cdr()
        .cdr()
        .get_list();
    }
}
</code></pre>
<p>Es stellt sich mir die Frage ob die Chance besteht, dass hier der Code so optimiert wird, dass das Ergebnis leistungstechnisch folgendem entspricht.</p>
<pre><code>rl_val_t tmp{ args[0] };

tmp = tmp.cdr();
tmp = tmp.cdr();
tmp = tmp.cdr();
tmp = tmp.cdr()
</code></pre>
<p>Oder spricht etwas konkret gegen solch eine Optimierung?</p>
<p>MFG</p>
<p>Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/333351/loop-unrolling-durch-inlining-hier-möglich</link><generator>RSS for Node</generator><lastBuildDate>Sun, 26 Apr 2026 22:37:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/333351.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 28 Jun 2015 14:13:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to loop unrolling durch inlining hier möglich? on Sun, 28 Jun 2015 14:13:53 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe folgende Klasse</p>
<pre><code>namespace
{
    class rl_list_traverser_t
    {

    public:

        explicit
        rl_list_traverser_t(rl_val_t traverse_list, std::string func_name)
            : traverse_list{ traverse_list }
            , func_name{ func_name }
        {
        }

        auto car()
            -&gt; rl_list_traverser_t&amp;
        {
            try
            {
                (*this).traverse_list = traverse_list.car();
            }
            catch(rl_unsupported_operation_t const&amp; e)
            {
                throw rl_ill_formed_list_error_t{ (*this).func_name };
            }

            return (*this);
        }

        auto cdr()
            -&gt; rl_list_traverser_t&amp;
        {
            try
            {
                (*this).traverse_list = traverse_list.cdr();
            }
            catch(rl_unsupported_operation_t const&amp; e)
            {
                throw rl_ill_formed_list_error_t{ (*this).func_name };
            }

            return (*this);
        }

        auto get_list()
            -&gt; rl_val_t
        {
            return traverse_list;
        }

    private:

        rl_val_t traverse_list;
        std::string func_name;

    }; 
}
</code></pre>
<p>Diese wird wie folgt verwendet:</p>
<pre><code>auto rl_lisp_cddddr(rl_val_array_t args)
    -&gt; rl_val_array_t
{    
    return { rl_list_traverser_t{ args[0], &quot;cddddr&quot; }
        .cdr()
        .cdr()
        .cdr()
        .cdr()
        .get_list();
    }
}
</code></pre>
<p>Es stellt sich mir die Frage ob die Chance besteht, dass hier der Code so optimiert wird, dass das Ergebnis leistungstechnisch folgendem entspricht.</p>
<pre><code>rl_val_t tmp{ args[0] };

tmp = tmp.cdr();
tmp = tmp.cdr();
tmp = tmp.cdr();
tmp = tmp.cdr()
</code></pre>
<p>Oder spricht etwas konkret gegen solch eine Optimierung?</p>
<p>MFG</p>
<p>Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2458024</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2458024</guid><dc:creator><![CDATA[Martin Kalbfuß]]></dc:creator><pubDate>Sun, 28 Jun 2015 14:13:53 GMT</pubDate></item><item><title><![CDATA[Reply to loop unrolling durch inlining hier möglich? on Sun, 28 Jun 2015 14:34:14 GMT]]></title><description><![CDATA[<p>Wenn wir schon beim Thema loop unrolling sind. Hat es irgend einen Vorteil wenn die Anzahl der Durchläufe einer Zählschleife bereits währen der Kompilierung bekannt ist. Also</p>
<pre><code>template &lt;size_t n&gt;
void do_it_n_times()
{
    for(size_t i = 0; i &lt; n; i++)
        do_it();
}
</code></pre>
<p>anstatt</p>
<p>void do_it_n_times(size_t n)<br />
{<br />
for(size_t i = 0; i &lt; n; i++)<br />
do_it();<br />
}<br />
[/code]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2458025</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2458025</guid><dc:creator><![CDATA[Martin Kalbfuß]]></dc:creator><pubDate>Sun, 28 Jun 2015 14:34:14 GMT</pubDate></item><item><title><![CDATA[Reply to loop unrolling durch inlining hier möglich? on Sun, 28 Jun 2015 14:35:32 GMT]]></title><description><![CDATA[<p>anstatt</p>
<pre><code>void do_it_n_times(size_t n)
{
    for(size_t i = 0; i &lt; n; i++)
        do_it();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2458026</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2458026</guid><dc:creator><![CDATA[Martin Kalbfuß]]></dc:creator><pubDate>Sun, 28 Jun 2015 14:35:32 GMT</pubDate></item><item><title><![CDATA[Reply to loop unrolling durch inlining hier möglich? on Sun, 28 Jun 2015 15:34:47 GMT]]></title><description><![CDATA[<p>Einfach mal den erzeugten Assemblercode ansehen. Hier ist die nicht-template Version:</p>
<pre><code>int k = 0;

void do_n_times(unsigned n)
{
  for(unsigned i = 0; i &lt; n; ++i)
  {
    k += i;
  }
}

int main()
{
  do_n_times(5);
}
</code></pre>
<p>ergibt</p>
<pre><code>do_n_times(unsigned int):
	xor	eax, eax
	test	edi, edi
	mov	edx, DWORD PTR k[rip]
	je	.L1
.L5:
	add	edx, eax
	add	eax, 1
	cmp	edi, eax
	jne	.L5
	mov	DWORD PTR k[rip], edx
.L1:
	rep ret
main:
	add	DWORD PTR k[rip], 10
	xor	eax, eax
	ret
k:
	.zero	4
</code></pre>
<p>Es wird zwar Code für die Funktion generiert, allerdings ist das Ergebnis schon vorberechnet in der main-Funktion und wird einfach nur noch in die Variable geschrieben.</p>
<p>Man kann die Funktion static machen oder in einen anonymen Namespace packen, dann wird auch kein Code mehr dafür generiert.</p>
<p>Die Template-Version</p>
<pre><code>int k = 0;

template&lt;unsigned int n&gt;
void t_do_n_times()
{
  for(unsigned i = 0; i &lt; n; ++i)
  {
    k+= i;
  }
}

int main()
{
  t_do_n_times&lt;5&gt;();
}
</code></pre>
<p>ergibt</p>
<pre><code>main:
	add	DWORD PTR k[rip], 10
	xor	eax, eax
	ret
k:
	.zero	4
</code></pre>
<p>Hier ist das gleiche Ergebnis, wie mit static oder namespace {}.</p>
<p>Fazit: Nein, hat keinen Vorteil, wenn dann kommt es auf den Inhalt von do_it an, ob der Compiler das zur Compilezeit berechnen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2458035</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2458035</guid><dc:creator><![CDATA[patrick246]]></dc:creator><pubDate>Sun, 28 Jun 2015 15:34:47 GMT</pubDate></item></channel></rss>