<?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[Fast gleicher Funktionskörper: wie zusammenfassend?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich würde gern zwei Funktionen implementieren, die bis auf wenige Abweichungen gleich sind.</p>
<p>Mal ein Beispiel:</p>
<pre><code class="language-cpp">void myFunction(int myInt)
{
  vector&lt;int&gt; values(3);  
  // Variante a würde vector&lt;int&gt; values(2); reichen

  // gleiches Zeug
  ...
  // ...
  for (i = 0; i &lt; maxI; i++)
  {
    for (j = 0; j &lt; maxJ; j++)
    {
      values[0] = myInt + j;
      values[1] = -myInt + i;
      // nur für variante b:
      values[2] = 0;

      // und weiter
      maxValue = ...

    }
  }
}
</code></pre>
<p>Die Funktionen unterscheiden sich im Endeffekt nur durch ein weiteres Wert im values Vektor. Während ich bei der Initialisierung noch das mittels eines Parameters bzw einer if abfrage mir vorstellen kann, finde ich ein if im inneren der Schleife eher unelegant und wenig performant, oder?</p>
<p>Gibt es bessere Vorschläge, sollte ich die Funktionen lieber duplizieren?</p>
<p>Danke im Voraus.<br />
Mat.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/218583/fast-gleicher-funktionskörper-wie-zusammenfassend</link><generator>RSS for Node</generator><lastBuildDate>Fri, 09 Oct 2026 00:37:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/218583.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 22 Jul 2008 16:07:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Fast gleicher Funktionskörper: wie zusammenfassend? on Tue, 22 Jul 2008 16:08:11 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich würde gern zwei Funktionen implementieren, die bis auf wenige Abweichungen gleich sind.</p>
<p>Mal ein Beispiel:</p>
<pre><code class="language-cpp">void myFunction(int myInt)
{
  vector&lt;int&gt; values(3);  
  // Variante a würde vector&lt;int&gt; values(2); reichen

  // gleiches Zeug
  ...
  // ...
  for (i = 0; i &lt; maxI; i++)
  {
    for (j = 0; j &lt; maxJ; j++)
    {
      values[0] = myInt + j;
      values[1] = -myInt + i;
      // nur für variante b:
      values[2] = 0;

      // und weiter
      maxValue = ...

    }
  }
}
</code></pre>
<p>Die Funktionen unterscheiden sich im Endeffekt nur durch ein weiteres Wert im values Vektor. Während ich bei der Initialisierung noch das mittels eines Parameters bzw einer if abfrage mir vorstellen kann, finde ich ein if im inneren der Schleife eher unelegant und wenig performant, oder?</p>
<p>Gibt es bessere Vorschläge, sollte ich die Funktionen lieber duplizieren?</p>
<p>Danke im Voraus.<br />
Mat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1551796</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1551796</guid><dc:creator><![CDATA[Matrim]]></dc:creator><pubDate>Tue, 22 Jul 2008 16:08:11 GMT</pubDate></item><item><title><![CDATA[Reply to Fast gleicher Funktionskörper: wie zusammenfassend? on Tue, 22 Jul 2008 16:28:30 GMT]]></title><description><![CDATA[<p>Mit templates gibt es verschiedenste Möglichkeiten.</p>
<p>Eine wäre den Code der unterschiedlich sein kann in eine Klasse auszulagern und diese dann zu verwenden:</p>
<pre><code class="language-cpp">struct WithTwoValues
{
    WithTwoValues() : values(2) {}

    void DoIt(int myInt, int i, int j)
    {
        values[0] = myInt + j;
        values[1] = -myInt + i;      
    }

    std::vector&lt;int&gt; values;
};

struct WithThreeValues
{
    WithThreeValues() : values(3) {}

    void DoIt(int myInt, int i, int j)
    {
        values[0] = myInt + j;
        values[1] = -myInt + i;      
        values[2] = 0;
    }

    std::vector&lt;int&gt; values;
};

template &lt;class Blubb&gt; void myFunction(int myInt)
{
  Blubb blubb;

  // gleiches Zeug
  ...
  // ...
  for (i = 0; i &lt; maxI; i++)
  {
    for (j = 0; j &lt; maxJ; j++)
    {
      blubb.DoIt(myInt, i, j);

      // und weiter
      maxValue = ...

    }
  }
} 

void foo()
{
    myFunction&lt;WithTwoValues&gt;(123);
    myFunction&lt;WithThreeValues&gt;(123);
}
</code></pre>
<p>Allerdings kann ich jetzt nicht abschätzen ob das in genau der Form für dein Problem eine gute/wartbare/elegante Lösung wäre, da du ja nicht verrätst worum es geht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1551809</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1551809</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 22 Jul 2008 16:28:30 GMT</pubDate></item><item><title><![CDATA[Reply to Fast gleicher Funktionskörper: wie zusammenfassend? on Tue, 22 Jul 2008 16:45:42 GMT]]></title><description><![CDATA[<p>entweder so, wie hustbaer schreibt oder so:</p>
<pre><code class="language-cpp">void myFunction(int myInt, size_t length)
{
  vector&lt;int&gt; values (length);
  /* ... */
  for (i = 0; i &lt; maxI; i++)
  {
    for (j = 0; j &lt; maxJ; j++)
    {
      values[0] = myInt + j;
      values[1] = -myInt + i;
      if (length == ...)
        values[2] = 0;

      // und weiter
      maxValue = ...
    }
  }
}
</code></pre>
<p>oder du machst es doch mit templates aber vll eher so:</p>
<pre><code class="language-cpp">template &lt;size_t length&gt;
  void myFunction(int myInt)
    {
      vector&lt;int&gt; values (length);  

      /* ... */
      for (i = 0; i &lt; maxI; i++)
       {
         for (j = 0; j &lt; maxJ; j++)
          {
            values[0] = myInt + j;
            values[1] = -myInt + i;
            values[2] = 0;
            maxValue = ...
          }
       }
    }

template &lt; &gt;
  void myFunction &lt;2&gt; (int myInt)
    {
      vector&lt;int&gt; values (2);  

      /* ... */
      for (i = 0; i &lt; maxI; i++)
       {
         for (j = 0; j &lt; maxJ; j++)
          {
            values[0] = myInt + j;
            values[1] = -myInt + i;
            maxValue = ...
          }
       }
    }
</code></pre>
<p>gibt halt viele möglichkeiten...</p>
<p>vll beschreibst du einfach mal, wieso du es genau brauchst und was du machen willst etc... ?<br />
dann kann man das vll besser sagen, was am besten wäre und was nicht so gut wäre oder wie man es vll doch ganz anders machen sollte ^^</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1551831</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1551831</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 22 Jul 2008 16:45:42 GMT</pubDate></item><item><title><![CDATA[Reply to Fast gleicher Funktionskörper: wie zusammenfassend? on Wed, 23 Jul 2008 09:56:43 GMT]]></title><description><![CDATA[<p>Ich habe halt eine Funktion, die sich an wenigen Stellen unterscheidet.<br />
Natürlich könnte man jedesmal entsprechend eine if Abfrage machen, aber wie schon gesagt, im inneren einer Schleife (mehrfach verschachtelt), kommt mir dies nicht effizient vor. Nur so ein Gefühl.</p>
<p>Somit wollte ich Möglichkeiten, wie man es anders bzw besser machen kann oder ob das mit dem if legitim und ein guter Stil ist.</p>
<p>Das mit dem Templates sieht in der Tat gut aus, werde ich mir mal anschauen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1552256</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1552256</guid><dc:creator><![CDATA[Matrim]]></dc:creator><pubDate>Wed, 23 Jul 2008 09:56:43 GMT</pubDate></item><item><title><![CDATA[Reply to Fast gleicher Funktionskörper: wie zusammenfassend? on Wed, 23 Jul 2008 10:18:32 GMT]]></title><description><![CDATA[<p>Matrim schrieb:</p>
<blockquote>
<p>Natürlich könnte man jedesmal entsprechend eine if Abfrage machen, aber wie schon gesagt, im inneren einer Schleife (mehrfach verschachtelt), kommt mir dies nicht effizient vor. Nur so ein Gefühl.</p>
</blockquote>
<p>Arbeitest du derart zeitkritisch, dass es darauf ankommt? Eine If-Abfrage braucht vielleicht einige Nanosekunden...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1552276</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1552276</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 23 Jul 2008 10:18:32 GMT</pubDate></item><item><title><![CDATA[Reply to Fast gleicher Funktionskörper: wie zusammenfassend? on Wed, 23 Jul 2008 12:22:19 GMT]]></title><description><![CDATA[<p>Wird wie in diesem Beispiel der 3. Wert immer auf einen Wert gesetzt, der sich in der Schleife nicht ändert ?</p>
<p>Dafür gibt es natürlich eine noch einfachere Lösung:</p>
<pre><code class="language-cpp">void myFunction(int myInt)
{
  vector&lt;int&gt; values(3);  
  // Variante a würde vector&lt;int&gt; values(2); reichen

  if(variante b)
  {
    values[2] = 0.0;
  }
  // gleiches Zeug
  ...
  // ...
  for (i = 0; i &lt; maxI; i++)
  {
    for (j = 0; j &lt; maxJ; j++)
    {
      values[0] = myInt + j;
      values[1] = -myInt + i;

      // und weiter
      maxValue = ...

    }
  }
}
</code></pre>
<p>Wird der Wert allerdings in der Schleife geändert, so ist eine der obrigen Lösungen notwendig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1552362</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1552362</guid><dc:creator><![CDATA[tunichtgut]]></dc:creator><pubDate>Wed, 23 Jul 2008 12:22:19 GMT</pubDate></item><item><title><![CDATA[Reply to Fast gleicher Funktionskörper: wie zusammenfassend? on Wed, 23 Jul 2008 12:43:34 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/8380">@Matrim</a>: da das &quot;if&quot; in der Schleife immer gleich ausgeht (für alle Durchläufe false oder alle true) wird das von der branch-prediction perfekt abgefangen und kostet dadurch sehr wenig. regelmässige patterns (1 0 1 0 1 0 ...) sind auch meist kein problem wenn sie kurz genug sind. &quot;ifs&quot; die unvorhersehbar wechseln sind dagegen deutlich teurer.<br />
alles in allem gilt aber hier auch: premature optimization is the root of all evil in programming.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1552382</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1552382</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 23 Jul 2008 12:43:34 GMT</pubDate></item></channel></rss>