<?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[Compile-Time-Trigger]]></title><description><![CDATA[<p>Hi,</p>
<p>kurze Rückfrage:<br />
Ich würde gerne bestimmte Teile von Codes in Funktionen nur bei bestimmten Template-Argumenten ausführen lassen. Wieso? Weil das z.B. ne Funktion ist, die 1 Mio. Mal pro Sekunde aufgerufen werden soll, da will ich kein zusätzliches if drin haben, wenn das die Performance beeinträchtigt.</p>
<p>Aber so was wie:</p>
<pre><code class="language-cpp">template&lt;bool doThis, bool doThat&gt;
void manipulateNumber(int&amp; number)
{
    if(doThis)
    {
        thisDo();
    }
    if(doThat)
    {
        thatDo();
    }
}
</code></pre>
<p>Wird doch wohl in jedem Fall zu 100% herausoptimiert, oder? Sonst Kritik zu diesem Mittel der Wahl? <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>
<p>Dankeschön!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/318053/compile-time-trigger</link><generator>RSS for Node</generator><lastBuildDate>Mon, 27 Jul 2026 22:33:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/318053.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 29 Jun 2013 09:51:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Compile-Time-Trigger on Sat, 29 Jun 2013 09:51:34 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>kurze Rückfrage:<br />
Ich würde gerne bestimmte Teile von Codes in Funktionen nur bei bestimmten Template-Argumenten ausführen lassen. Wieso? Weil das z.B. ne Funktion ist, die 1 Mio. Mal pro Sekunde aufgerufen werden soll, da will ich kein zusätzliches if drin haben, wenn das die Performance beeinträchtigt.</p>
<p>Aber so was wie:</p>
<pre><code class="language-cpp">template&lt;bool doThis, bool doThat&gt;
void manipulateNumber(int&amp; number)
{
    if(doThis)
    {
        thisDo();
    }
    if(doThat)
    {
        thatDo();
    }
}
</code></pre>
<p>Wird doch wohl in jedem Fall zu 100% herausoptimiert, oder? Sonst Kritik zu diesem Mittel der Wahl? <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>
<p>Dankeschön!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335180</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335180</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Sat, 29 Jun 2013 09:51:34 GMT</pubDate></item><item><title><![CDATA[Reply to Compile-Time-Trigger on Sat, 29 Jun 2013 10:05:14 GMT]]></title><description><![CDATA[<p>Ich dachte dafür gibt es <a href="http://www.cplusplus.com/reference/type_traits/enable_if/" rel="nofollow">enable_if</a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335187</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335187</guid><dc:creator><![CDATA[nwp3]]></dc:creator><pubDate>Sat, 29 Jun 2013 10:05:14 GMT</pubDate></item><item><title><![CDATA[Reply to Compile-Time-Trigger on Sat, 29 Jun 2013 10:09:52 GMT]]></title><description><![CDATA[<p>Mir ist enable_if durchaus bekannt, nur sehe ich gerade nicht, wie ich damit <em>Teile meiner Funktion</em> (de)aktivieren kann? Ich will die Funktion in jedem Fall nutzen und ich will auch keine Spezialisierung implementieren. Natürlich könnte man für Teile einen leeren Funktionsrumpf machen und den dann nur im Falle von gegebenen Argumenten implementieren.</p>
<p>Dann müsste der Compiler statt einem if(true) oder if(false) aber einen leeren Funktionsrumpf wegoptimieren, erscheint mir jetzt nicht weniger Aufwand.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335190</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335190</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Sat, 29 Jun 2013 10:09:52 GMT</pubDate></item><item><title><![CDATA[Reply to Compile-Time-Trigger on Sat, 29 Jun 2013 10:28:14 GMT]]></title><description><![CDATA[<p>Natürlich wird das optimiert, das sind ja Konstanten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335192</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335192</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Sat, 29 Jun 2013 10:28:14 GMT</pubDate></item><item><title><![CDATA[Reply to Compile-Time-Trigger on Sat, 29 Jun 2013 10:55:11 GMT]]></title><description><![CDATA[<p>nwp3 schrieb:</p>
<blockquote>
<p>Ich dachte dafür gibt es <a href="http://www.cplusplus.com/reference/type_traits/enable_if/" rel="nofollow">enable_if</a>.</p>
</blockquote>
<p>Nein, das ist was völlig anderes. <code>enable_if</code> wird auch größtenteils für SFINAE eingesetzt.</p>
<p>Bashar schrieb:</p>
<blockquote>
<p>Natürlich wird das optimiert, das sind ja Konstanten.</p>
</blockquote>
<p><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="👍"
    /><br />
Das Beste ist, einfach ein if-Statement zu benutzen. Ist am lesbarsten, kürzesten und wahrscheinlich auch am schnellsten was das Kompilieren angeht (von der Laufzeit her optimiert der Compiler bei allen Varianten wahrscheinlich gleich viel weg).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335194</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335194</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sat, 29 Jun 2013 10:55:11 GMT</pubDate></item><item><title><![CDATA[Reply to Compile-Time-Trigger on Sat, 29 Jun 2013 10:58:17 GMT]]></title><description><![CDATA[<p>Wenn du ein Maniac bist, noch eine Frage: Kannst du die bool-Argumente als Literale geben? Dann kannst du bestimmt was mit dem Präprozessor und Boost-PP anstellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335196</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335196</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sat, 29 Jun 2013 10:58:17 GMT</pubDate></item><item><title><![CDATA[Reply to Compile-Time-Trigger on Sat, 29 Jun 2013 11:10:23 GMT]]></title><description><![CDATA[<p>Sowas ginge auch noch, aber auch da wäre die Kompilier-Zeit garantiert länger:</p>
<pre><code>#include &lt;iostream&gt;

#define IF(b, ...)

template&lt;bool B, void(*ptr1)()&gt;
struct if_execute;

template&lt;void(*ptr1)()&gt;
struct if_execute&lt;true, ptr1&gt;
{
	static void(* const exec)();
};

template&lt;void(*ptr1)()&gt;
void(* const if_execute&lt;true, ptr1&gt;::exec)() = ptr1;

template&lt;void(*ptr1)()&gt;
struct if_execute&lt;false, ptr1&gt;
{
	static constexpr void exec() {} // Funktion ist constexpr - existiert zur Laufzeit nicht mehr.
};

void doThat() { std::cout &lt;&lt; &quot;doThat!&quot;; }
void doThis() { std::cout &lt;&lt; &quot;doThis!&quot;; }

template&lt;bool doThis_, bool doThat_&gt;
void manipulateNumber()
{
	if_execute&lt;doThis_, doThis&gt;::exec();
	if_execute&lt;doThat_, doThat&gt;::exec();
}

int main()
{
	manipulateNumber&lt;true, false&gt;();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2335197</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335197</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sat, 29 Jun 2013 11:10:23 GMT</pubDate></item><item><title><![CDATA[Reply to Compile-Time-Trigger on Sat, 29 Jun 2013 11:11:51 GMT]]></title><description><![CDATA[<p>Ok, danke, dann hat sich das erledigt. <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>
<p>Sone:<br />
Präprozessor, wie das? Der kommt doch vor Template-Ebene.</p>
<p>Es ist schon so, dass zur Laufzeit eine Methode aufgerufen wird, welche die Parameter analysiert und dementsprechend immer eine bestimmte Funktion mit gewissen Template-Parametern aufruft (innerhalb der Schleife ist der Template-Parameter aber konstant, darum geht's).</p>
<p>Die Festlegung, welche Version aufgerufen wird, findet also durchaus zur Laufzeit statt, nur eben auf einer performance-unkritischen Ebene.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335198</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335198</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Sat, 29 Jun 2013 11:11:51 GMT</pubDate></item><item><title><![CDATA[Reply to Compile-Time-Trigger on Sat, 29 Jun 2013 11:25:28 GMT]]></title><description><![CDATA[<blockquote>
<p>Präprozessor, wie das? Der kommt doch vor Template-Ebene.</p>
</blockquote>
<p>Genau. Aber wenn die Argumente vor der Template-Ebene bekannt sind, also schon direkt vom Codeäffchen gegeben sind, dann kannst du schon auf Text-Ebene entweder ein Statement da stehen haben oder nicht. Und da muss der Compiler nichts mehr machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335204</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335204</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sat, 29 Jun 2013 11:25:28 GMT</pubDate></item><item><title><![CDATA[Reply to Compile-Time-Trigger on Sat, 29 Jun 2013 11:30:34 GMT]]></title><description><![CDATA[<p>Ok, aber ich muss eben schon Gebrauch davon machen, dass er mehrere Versionen der Funktionen automatisch generiert, die ich dann eben je nach Laufzeit-Check-Ergebnis aufrufen kann. Das vervielfältigt den intern generierten Code zwar, aber zur Compilezeit ist eben nicht so viel bekannt, dass man die Funktion auf eine Variante reduzieren könnte.</p>
<p>Daher ist die Variante im OP wohl perfekt für mich. <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/2335206</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335206</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Sat, 29 Jun 2013 11:30:34 GMT</pubDate></item><item><title><![CDATA[Reply to Compile-Time-Trigger on Sat, 29 Jun 2013 11:42:01 GMT]]></title><description><![CDATA[<p>Ich hab bei der ganzen Geschichte das Gefühl, dass ein Compiler das eventuell auch ohne Templates können sollte. Wäre einen Versuch wert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335208</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335208</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Sat, 29 Jun 2013 11:42:01 GMT</pubDate></item><item><title><![CDATA[Reply to Compile-Time-Trigger on Sat, 29 Jun 2013 11:43:34 GMT]]></title><description><![CDATA[<p>Wie wärs mit Vererbung und klassischer Polymorphie?</p>
<pre><code>class Base
{
public:
	virtual void doIt() = 0;
};

class doThis : public Base
{
public:
	virtual void doIt()
	{
		// lets doThis shit
	}
};

class doThat : public Base
{
public:
	virtual void doIt()
	{
		// lets doThat shit
	}
};

void foo(bool boolVar)
{
	Base * doIt;
	if( boolVar )
		doIt = new doThis();
	else
		doIt = new doThat();

	doIt-&gt;doIt();
}
</code></pre>
<p>Wenn du es richtig machst, wäre das am Anfang eine Fallunterscheidung und dann nie mehr etwas in der Richtung, kein if kein nix (ausser der Pointerdereferenzierung).<br />
Die Dynamik hast du damit auch zur Laufzeit.<br />
Und das kann man bestimmt noch ein wenig weiter treiben mit templates.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335209</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335209</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Sat, 29 Jun 2013 11:43:34 GMT</pubDate></item><item><title><![CDATA[Reply to Compile-Time-Trigger on Sat, 29 Jun 2013 12:04:41 GMT]]></title><description><![CDATA[<p>Skym0sh0: Weißt du was für ein (hier unnötiger) Overhead entsteht, sobald Polymorphie im Spiel ist?<br />
Das ist übrigens auch leicht Offtopic, weil es ja um Compile-Zeit geht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335218</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sat, 29 Jun 2013 12:04:41 GMT</pubDate></item><item><title><![CDATA[Reply to Compile-Time-Trigger on Sat, 29 Jun 2013 12:07:42 GMT]]></title><description><![CDATA[<p>Bashar schrieb:</p>
<blockquote>
<p>Ich hab bei der ganzen Geschichte das Gefühl, dass ein Compiler das eventuell auch ohne Templates können sollte. Wäre einen Versuch wert.</p>
</blockquote>
<p>Meinst du, den boolschen Wert als Parameter? Eine Funktion wie die wird wahrscheinlich geinlined, und dann sieht der Compiler ja auch wieder ein <code>if(true/false)</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335219</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335219</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sat, 29 Jun 2013 12:07:42 GMT</pubDate></item><item><title><![CDATA[Reply to Compile-Time-Trigger on Sat, 29 Jun 2013 12:26:46 GMT]]></title><description><![CDATA[<p>Ja. Nein.</p>
<p>Das Problem ist schon ein bisschen komplizierter. Er hat ungefähr sowas:</p>
<pre><code class="language-cpp">bool b = ...;
for (...) {
   f(b);
}

void f(bool b) {
  if (b) ...
}
</code></pre>
<p>Und möchte nicht, dass dieses if jedesmal ausgeführt wird. Im Prinzip muss das ganze so transformiert werden:</p>
<pre><code class="language-cpp">bool b = ...
if (b)
  for (...) {
    f_b_is_true();
  }
else
  for (...) {
    f_b_is_false();
  }
</code></pre>
<p>Das kann man mit Templates machen, so dass man die beiden f's nicht separat implementieren muss. Ich kann mir aber vorstellen, dass ein Compiler diese Transformation, die man sich ja wie das Herausfaktoriseren einer Schleifeninvariante vorstellen kann, selbst durchführen kann. Es ist nicht ganz trivial, insbesondere stell ich mir die Abwägung, ob das im Einzelfall gemacht werden soll, nicht ganz einfach vor, aber wer weiß...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335224</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335224</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Sat, 29 Jun 2013 12:26:46 GMT</pubDate></item><item><title><![CDATA[Reply to Compile-Time-Trigger on Sat, 29 Jun 2013 12:32:34 GMT]]></title><description><![CDATA[<p>Nennt sich Loop unswitching. Hat GCC schon in Version 3.4 eingeführt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335226</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335226</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sat, 29 Jun 2013 12:32:34 GMT</pubDate></item><item><title><![CDATA[Reply to Compile-Time-Trigger on Sat, 29 Jun 2013 12:44:35 GMT]]></title><description><![CDATA[<p>Skym0sh0:<br />
Teile einer Funktion sollen sich anders verhalten. Das erreiche ich hiermit nicht. Und selbst wenn, Polymorphie in einer zeitkritischen Schleife, die rasen muss wie Bolt, ist nun wirklich das Gegenteil von einer guten Lösung.</p>
<p>Bashar:<br />
Dein Code trifft exakt das, was ich gerade tue. Mein Problem habe ich lediglich etwas reduziert dargestellt. Die eigentliche Hauptfunktion mit der Schleife ist sehr lang und ruft zwischendurch kleinere Funktionen auf. Die kleineren Funktionen benötigen die Variable zum prüfen eben auch. Es gibt somit mehrere verschachtelt aufgerufene Funktionen, die _true() oder _false() wären. Geinlined wird hier nichts, das sind keine Wenigzeiler mehr.</p>
<p>Möglicherweise kann der Compiler das tatsächlich auch ohne Templateparameter auflösen, was natürlich weit besser als die Template-Lösung wäre. Aber ohne Sicherheit will ich diesen Schritt auf keinen Fall gehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335230</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335230</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Sat, 29 Jun 2013 12:44:35 GMT</pubDate></item></channel></rss>