<?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[Checken ob callable-Objekt einen state hat oder nicht?]]></title><description><![CDATA[<p>Hallo,</p>
<p>gibt es eine Möglichkeit herauszufinden ob ein callable Objekt (also ein Objekt das den <code>operator()</code> definiert hat) einen internen State hat? Mit internen State ist gemeint dass der Rückgabewert nicht nur vom Input abhängt.</p>
<p>Ich stelle mir das in etwa so vor:</p>
<pre><code>#include &lt;iostream&gt;

int f1() { return 1; }

int f2() { static int i = 0; return i += 1; }

int global_i = 0;
int f3(){ return global_i += 1; }

struct f4 {
	int operator()() { return 1; }
};

struct f5 {
	int operator()() { return m_i += 1; }
	int m_i = 0;
};

int main()
{
    std::cout &lt;&lt; std::boolalpha;
    std::cout &lt;&lt; has_internal_state&lt;f1&gt;::value &lt;&lt; '\n'; // false
    std::cout &lt;&lt; has_internal_state&lt;f2&gt;::value &lt;&lt; '\n'; // true
    std::cout &lt;&lt; has_internal_state&lt;f3&gt;::value &lt;&lt; '\n'; // true
    std::cout &lt;&lt; has_internal_state&lt;f4&gt;::value &lt;&lt; '\n'; // false
    std::cout &lt;&lt; has_internal_state&lt;f5&gt;::value &lt;&lt; '\n'; // true
}
</code></pre>
<p>Geht das irgendwie?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/327714/checken-ob-callable-objekt-einen-state-hat-oder-nicht</link><generator>RSS for Node</generator><lastBuildDate>Thu, 09 Jul 2026 10:22:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/327714.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 30 Aug 2014 14:00:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Checken ob callable-Objekt einen state hat oder nicht? on Sat, 30 Aug 2014 14:17:13 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>gibt es eine Möglichkeit herauszufinden ob ein callable Objekt (also ein Objekt das den <code>operator()</code> definiert hat) einen internen State hat? Mit internen State ist gemeint dass der Rückgabewert nicht nur vom Input abhängt.</p>
<p>Ich stelle mir das in etwa so vor:</p>
<pre><code>#include &lt;iostream&gt;

int f1() { return 1; }

int f2() { static int i = 0; return i += 1; }

int global_i = 0;
int f3(){ return global_i += 1; }

struct f4 {
	int operator()() { return 1; }
};

struct f5 {
	int operator()() { return m_i += 1; }
	int m_i = 0;
};

int main()
{
    std::cout &lt;&lt; std::boolalpha;
    std::cout &lt;&lt; has_internal_state&lt;f1&gt;::value &lt;&lt; '\n'; // false
    std::cout &lt;&lt; has_internal_state&lt;f2&gt;::value &lt;&lt; '\n'; // true
    std::cout &lt;&lt; has_internal_state&lt;f3&gt;::value &lt;&lt; '\n'; // true
    std::cout &lt;&lt; has_internal_state&lt;f4&gt;::value &lt;&lt; '\n'; // false
    std::cout &lt;&lt; has_internal_state&lt;f5&gt;::value &lt;&lt; '\n'; // true
}
</code></pre>
<p>Geht das irgendwie?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415457</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415457</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Sat, 30 Aug 2014 14:17:13 GMT</pubDate></item><item><title><![CDATA[Reply to Checken ob callable-Objekt einen state hat oder nicht? on Sat, 30 Aug 2014 14:05:10 GMT]]></title><description><![CDATA[<p>Nein, nicht generisch und nicht zur Compile-Time.<br />
Einfach in die Spezifikation schreiben, dass der Funktor keinen state - in deinem Sinne - haben darf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415458</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415458</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sat, 30 Aug 2014 14:05:10 GMT</pubDate></item><item><title><![CDATA[Reply to Checken ob callable-Objekt einen state hat oder nicht? on Sat, 30 Aug 2014 14:06:48 GMT]]></title><description><![CDATA[<blockquote>
<p>also ein Objekt das den operator() definiert hat</p>
</blockquote>
<p>Nein, ein Objekt dass als &quot;Name&quot; eines Funktionsaufrufs fungieren kann. Sonst wäre ja eine Funktion gar nicht callable. Oder ein Funktionszeiger.</p>
<p>Wie wärs mit diesem Trait:</p>
<pre><code>template &lt;typename T&gt;
using has_internal_state = std::is_empty&lt;T&gt;;
</code></pre>
<p>Das prüft ob ein Typ eine nicht-leere Klasse ist (siehe <a href="http://en.cppreference.com/w/cpp/types/is_empty" rel="nofollow">hier</a>).</p>
<p>Ob eine Funktion intern eine statische Variable beherbergt ist leider nicht festzustellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415459</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415459</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Sat, 30 Aug 2014 14:06:48 GMT</pubDate></item><item><title><![CDATA[Reply to Checken ob callable-Objekt einen state hat oder nicht? on Sat, 30 Aug 2014 14:12:47 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<blockquote>
<p>also ein Objekt das den operator() definiert hat</p>
</blockquote>
<p>Wie wärs mit diesem Trait:</p>
<pre><code>template &lt;typename T&gt;
using has_internal_state = std::is_empty&lt;T&gt;;
</code></pre>
<p>Das prüft ob ein Typ eine nicht-leere Klasse ist (siehe <a href="http://en.cppreference.com/w/cpp/types/is_empty" rel="nofollow">hier</a>).</p>
</blockquote>
<p>Aber auch nur wenn std::is_class&lt;T&gt;::true, ansonsten wäre eine Funktion ja verboten.<br />
Und das sollteste du noch negieren, eine std::is_empty == true entspricht ja has_internal_state == false.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415460</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415460</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sat, 30 Aug 2014 14:12:47 GMT</pubDate></item><item><title><![CDATA[Reply to Checken ob callable-Objekt einen state hat oder nicht? on Sat, 30 Aug 2014 14:25:06 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>Wie wärs mit diesem Trait:</p>
<pre><code>template &lt;typename T&gt;
using has_internal_state = std::is_empty&lt;T&gt;;
</code></pre>
<p>Das prüft ob ein Typ eine nicht-leere Klasse ist (siehe <a href="http://en.cppreference.com/w/cpp/types/is_empty" rel="nofollow">hier</a>).</p>
</blockquote>
<p>Ne das reicht leider nicht, aber Danke für den Vorschlag.</p>
<p>Arcoth schrieb:</p>
<blockquote>
<p>Ob eine Funktion intern eine statische Variable beherbergt ist leider nicht festzustellen.</p>
</blockquote>
<p>Nathan schrieb:</p>
<blockquote>
<p>Nein, nicht generisch und nicht zur Compile-Time.<br />
Einfach in die Spezifikation schreiben, dass der Funktor keinen state - in deinem Sinne - haben darf.</p>
</blockquote>
<p>Mist, das hatte ich befürchtet.</p>
<p>Hätte da gerne eine Fehlermeldung zur Compile-Zeit gehabt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415461</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415461</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Sat, 30 Aug 2014 14:25:06 GMT</pubDate></item><item><title><![CDATA[Reply to Checken ob callable-Objekt einen state hat oder nicht? on Sat, 30 Aug 2014 14:36:39 GMT]]></title><description><![CDATA[<p>Wenns Deine Klassen sind, kannste es mit const andeuten.</p>
<pre><code>struct f5 {
    int operator()(int a,int b) const { return a+5*b; }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2415467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415467</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 30 Aug 2014 14:36:39 GMT</pubDate></item><item><title><![CDATA[Reply to Checken ob callable-Objekt einen state hat oder nicht? on Sat, 30 Aug 2014 14:39:49 GMT]]></title><description><![CDATA[<blockquote>
<p>Aber auch nur wenn std::is_class&lt;T&gt;::true, ansonsten wäre eine Funktion ja verboten.</p>
</blockquote>
<p>Das wird selbstverständlich schon von <code>std::is_empty</code> geprüft. Siehe <a href="https://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html" rel="nofollow">https://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html</a> unter <code>__is_empty</code> .</p>
<blockquote>
<p>Und das sollteste du noch negieren, eine std::is_empty == true entspricht ja has_internal_state == false.</p>
</blockquote>
<p>Ups, ja.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415468</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415468</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Sat, 30 Aug 2014 14:39:49 GMT</pubDate></item><item><title><![CDATA[Reply to Checken ob callable-Objekt einen state hat oder nicht? on Sat, 30 Aug 2014 15:40:03 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Wenns Deine Klassen sind, kannste es mit const andeuten.</p>
<pre><code>struct f5 {
    int operator()(int a,int b) const { return a+5*b; }
};
</code></pre>
</blockquote>
<p>Das Problem ist dass es meistens keine Klassen sind sondern Funktionen (da sie ja eh keinen State haben dürfen der den Output verändert werden Funktoren nur selten benutzt).</p>
<p>Aber ich hab mal gelesen dass in C++14 Compile-Time Reflection kommen soll, würde es dann damit gehen? Dann wüsste ich wenigstens dass ich es in der Zukunft machen kann <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/2415473</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415473</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Sat, 30 Aug 2014 15:40:03 GMT</pubDate></item><item><title><![CDATA[Reply to Checken ob callable-Objekt einen state hat oder nicht? on Sat, 30 Aug 2014 16:07:29 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<blockquote>
<p>Aber auch nur wenn std::is_class&lt;T&gt;::true, ansonsten wäre eine Funktion ja verboten.</p>
</blockquote>
<p>Das wird selbstverständlich schon von <code>std::is_empty</code> geprüft. Siehe <a href="https://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html" rel="nofollow">https://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html</a> unter <code>__is_empty</code> .</p>
</blockquote>
<p>Ja, std::is_empty von Funktion ist false, das bedeutet has_internal_state ist true...</p>
<p>happystudent schrieb:</p>
<blockquote>
<p>Das Problem ist dass es meistens keine Klassen sind sondern Funktionen (da sie ja eh keinen State haben dürfen der den Output verändert werden Funktoren nur selten benutzt).</p>
</blockquote>
<p>Falls du den GCC nutzt kannst du dafür &lsqb;&lsqb;gnu::pure&rsqb;&rsqb; und &lsqb;&lsqb;gnu::const&rsqb;&rsqb; verwenden.</p>
<blockquote>
<p>Aber ich hab mal gelesen dass in C++14 Compile-Time Reflection kommen soll, würde es dann damit gehen? Dann wüsste ich wenigstens dass ich es in der Zukunft machen kann <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>
</blockquote>
<p>C++14 gibts schon, damit würd es zwar evtl. gehen (je nachdem, was da genau rein soll, daran arbeiten sie noch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> ), aber gibts nicht in C++14, hoffentlich im nächsten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415478</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415478</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sat, 30 Aug 2014 16:07:29 GMT</pubDate></item><item><title><![CDATA[Reply to Checken ob callable-Objekt einen state hat oder nicht? on Sat, 30 Aug 2014 16:12:53 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>C++14 gibts schon, damit würd es zwar evtl. gehen (je nachdem, was da genau rein soll, daran arbeiten sie noch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> ), aber gibts nicht in C++14, hoffentlich im nächsten.</p>
</blockquote>
<p>Ach so, Ok. Na dann vielleicht in nicht allzu ferner Zukunft mal.</p>
<p>Auf jeden Fall Danke für die Antworten <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415479</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415479</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Sat, 30 Aug 2014 16:12:53 GMT</pubDate></item><item><title><![CDATA[Reply to Checken ob callable-Objekt einen state hat oder nicht? on Sat, 30 Aug 2014 17:08:42 GMT]]></title><description><![CDATA[<p>happystudent schrieb:</p>
<blockquote>
<p>Mit internen State ist gemeint dass der Rückgabewert nicht nur vom Input abhängt.</p>
</blockquote>
<p>Und was ist mit &quot;externem state&quot;?</p>
<pre><code class="language-cpp">int g_value = 42;
struct f6 {
    int operator()() const { return g_value++; }
};

struct f7 {
    f7(int* p) : m_p(p) {}
    int* const m_p;
    int operator()() const { return (*m_p)++; }
};

struct f8 {
    int operator()() const { return time(0); }
};
</code></pre>
<p>Ich denke was du meinst ist eine &quot;pure function&quot;:<br />
<a href="http://en.wikipedia.org/wiki/Pure_function" rel="nofollow">http://en.wikipedia.org/wiki/Pure_function</a></p>
<p>Und dann gibt's natürlich auch das Gegenteil, Funktoren die &quot;pure&quot; sind obwohl sie non-const Datenmember enthalten.<br />
z.B. welche wo die Datenmember nur deswegen nicht const sind damit man den Funktor zuweisen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415483</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415483</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 30 Aug 2014 17:08:42 GMT</pubDate></item><item><title><![CDATA[Reply to Checken ob callable-Objekt einen state hat oder nicht? on Sat, 30 Aug 2014 17:22:04 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Ich denke was du meinst ist eine &quot;pure function&quot;:<br />
<a href="http://en.wikipedia.org/wiki/Pure_function" rel="nofollow">http://en.wikipedia.org/wiki/Pure_function</a></p>
</blockquote>
<p>Ja, genau das meine ich. Also eine Funktion y = f(x) die für das gleiche x auch immer das gleiche y zurückgibt.</p>
<p>Heißt das es gibt eine Möglichkeit die &quot;pure-ness&quot; einer Funktion zu überprüfen, oder war das nur eine Anmerkung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415485</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415485</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Sat, 30 Aug 2014 17:22:04 GMT</pubDate></item><item><title><![CDATA[Reply to Checken ob callable-Objekt einen state hat oder nicht? on Sat, 30 Aug 2014 17:29:38 GMT]]></title><description><![CDATA[<p>War nur ne Korrektur, weil deine Beschreibung mit &quot;internem State&quot; falsch war (siehe meine Gegenbeispiele).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415487</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415487</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 30 Aug 2014 17:29:38 GMT</pubDate></item><item><title><![CDATA[Reply to Checken ob callable-Objekt einen state hat oder nicht? on Sat, 30 Aug 2014 17:42:58 GMT]]></title><description><![CDATA[<p>Es wäre mal schön wenn man auf alle Informationen zugreifen könnte die der Compiler (sowieso schon) hat.</p>
<p>Weil zu Optimierungszwecken muss dieser ja eh checken ob eine Funktion jetzt &quot;pure&quot; ist oder nicht und dass man diese ja vorhandene Info nicht nutzen kann ist echt nervig...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415488</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415488</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Sat, 30 Aug 2014 17:42:58 GMT</pubDate></item><item><title><![CDATA[Reply to Checken ob callable-Objekt einen state hat oder nicht? on Sat, 30 Aug 2014 18:22:47 GMT]]></title><description><![CDATA[<blockquote>
<p>Ja, std::is_empty von Funktion ist false, das bedeutet has_internal_state ist true...</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f635.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--dizzy_face"
      title="X)"
      alt="😵"
    /><br />
Nächstes mal denke ich nach, versprochen!</p>
<pre><code>template &lt;typename T&gt;
using has_internal_state = std::integral_constant&lt;bool, std::is_class&lt;T&gt;::value &amp;&amp; !std::is_empty&lt;T&gt;::value&gt;;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2415490</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415490</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Sat, 30 Aug 2014 18:22:47 GMT</pubDate></item><item><title><![CDATA[Reply to Checken ob callable-Objekt einen state hat oder nicht? on Sun, 31 Aug 2014 07:03:04 GMT]]></title><description><![CDATA[<pre><code>struct f9 {
    int const faktor;
    f9(int faktor)
    :faktor(faktor){
    }
    int operator()(int x) const {
        return x*faktor; 
    }
};
</code></pre>
<p>mit internal_state, aber pure. brtrifft viele std::bind-Sachen und vielleicht 50% der lamdas.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415506</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415506</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 31 Aug 2014 07:03:04 GMT</pubDate></item><item><title><![CDATA[Reply to Checken ob callable-Objekt einen state hat oder nicht? on Sun, 31 Aug 2014 12:50:45 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>mit internal_state, aber pure. brtrifft viele std::bind-Sachen und vielleicht 50% der lamdas.</p>
</blockquote>
<p>Richtig, der Begriff &quot;internal_state&quot; war hier wohl etwas irreführend.</p>
<p>Ich frag mich aber auch gerade ob so ein Compiler wirklich immer den Beweis erbringt ob eine Funktion pure ist oder nicht... Weil sowas zum Beispiel:</p>
<pre><code>int f(int i)
{
    if (is_prime(i))
        return time(0); // impure
    return i; // pure
}
</code></pre>
<p>wäre ja ziemlich schwer zu checken, bzw. würde wohl einiges an Compile-Zeit brauchen (vorrausgesetzt dass alle Aufrufe von f und die entsprechenden Parameter zur Compile-Zeit bekannt sind). Wenn jetzt nie ein i übergeben wird welches die Bedingung &quot;is_prime&quot; erfüllt, wäre die Funktion ja pure.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415540</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415540</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Sun, 31 Aug 2014 12:50:45 GMT</pubDate></item><item><title><![CDATA[Reply to Checken ob callable-Objekt einen state hat oder nicht? on Sun, 31 Aug 2014 13:10:13 GMT]]></title><description><![CDATA[<p>happystudent schrieb:</p>
<blockquote>
<p>[...]</p>
</blockquote>
<p>Naja, bei is_prime wäre das ja eventuell noch möglich, aber:</p>
<pre><code>int f(int i)
{
  if (P == NP) // P und NP Mengen der Komplexitätstheorie...
   return time(0);
  return i;
}
</code></pre>
<p>eher nicht so.<br />
Wenn ein Compiler schafft, das zu beweisen, ist er ziemlich gut.</p>
<p>Aus diesem Grund gibt es Attribute für Funktionen.<br />
Beim GCC ist das &lsqb;&lsqb;gnu::pure&rsqb;&rsqb; bzw. &lsqb;&lsqb;gnu::const&rsqb;&rsqb; (letzteres ist das eigentliche pure, ersteres &quot;keine Seiteneffekte, aber Wert abhängig von globalen Variablen&quot;).<br />
Mithilfe der -Wsuggest-attribute=pure/const sieht man schön, was der Compiler als pure/const identifiziert.<br />
Bspw.</p>
<pre><code>bool is_prime(unsigned i)
{
    if (i == 1u)
        return false;
    else if (i == 2u)
        return true;
    else if (i % 2 == 0u)
        return false;
    for (auto j = 3u; j * j &lt;= i; ++j) // kein wurzel, da sqrt offenbar nicht const...
        if (i % j == 0u)
            return false;
    return true;
}
</code></pre>
<p>identifiziert der als const (warning: function might be candidate for attribute 'const' if it is known to return normally [-Wsuggest-attribute=const]).<br />
Folgenden Code, der dein f aufruft:</p>
<pre><code>int g()
{
    return f(1);
}
</code></pre>
<p>ist auch noch const, genauso wie f(4).<br />
Und das überrascht mich jetzt wirklich: selbst f(9), wo er in die Schleife muss, wird als const identifiziert!<br />
Der Compiler scheint constant propagation anzuwenden und denn is_prime Aufruf wegzuoptimieren und somit auch den Aufruf zu time zu vernachlässigen.<br />
Das heißt, die Antwort die du suchst ist: ja, macht er. Damit hätt ich jetzt wirklich nicht gerechnet...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415542</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415542</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sun, 31 Aug 2014 13:10:13 GMT</pubDate></item><item><title><![CDATA[Reply to Checken ob callable-Objekt einen state hat oder nicht? on Sun, 31 Aug 2014 16:09:04 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>[...]</p>
<p>Das heißt, die Antwort die du suchst ist: ja, macht er. Damit hätt ich jetzt wirklich nicht gerechnet...</p>
</blockquote>
<p>Cool, schlauer Compiler <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Will gar nicht wissen wieviel Arbeit da drinnen steckt, nur um sowas vermeintlich &quot;einfaches&quot; zu checken <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415562</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415562</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Sun, 31 Aug 2014 16:09:04 GMT</pubDate></item></channel></rss>