<?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[C++ typeof Äquivalent &#x2F; switch nach Objekttyp]]></title><description><![CDATA[<p>In dem PDF-Dokument: &quot;AN ENABLING OPTIMIZATION FOR C++ VIRTUAL FUNCTIONS&quot; (über <a href="http://google.de" rel="nofollow">google.de</a> suchen) wird &quot;switch&quot; mit &quot;typeof&quot; kombiniert:</p>
<p>&quot;Base&quot; ist die Basisklasse, &quot;Sub1&quot; und &quot;Sub2&quot; davon abgeleitete Klassen:</p>
<pre><code class="language-cpp">switch(typeof(this)) 
{
case Base:
    Base::foo(); break;
case Sub1:
    Sub1::foo(); break;
case Sub2:
    Sub2::foo(); break;
default:
    this-&gt;foo(); break;
}
</code></pre>
<p>Der Artikel stammt aus den 90er Jahren. MSCV2013 kennt keinen &quot;typeof&quot; Befehl. Gibt es ein heutiges aktuelles Äquivalent dazu? Kann mit MSVC2013 oder MSVC2015 ein Code mit der gleichen Funktion geschrieben werden?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/334930/c-typeof-äquivalent-switch-nach-objekttyp</link><generator>RSS for Node</generator><lastBuildDate>Sat, 25 Apr 2026 02:30:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/334930.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 20 Oct 2015 17:54:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to C++ typeof Äquivalent &#x2F; switch nach Objekttyp on Tue, 20 Oct 2015 17:54:20 GMT]]></title><description><![CDATA[<p>In dem PDF-Dokument: &quot;AN ENABLING OPTIMIZATION FOR C++ VIRTUAL FUNCTIONS&quot; (über <a href="http://google.de" rel="nofollow">google.de</a> suchen) wird &quot;switch&quot; mit &quot;typeof&quot; kombiniert:</p>
<p>&quot;Base&quot; ist die Basisklasse, &quot;Sub1&quot; und &quot;Sub2&quot; davon abgeleitete Klassen:</p>
<pre><code class="language-cpp">switch(typeof(this)) 
{
case Base:
    Base::foo(); break;
case Sub1:
    Sub1::foo(); break;
case Sub2:
    Sub2::foo(); break;
default:
    this-&gt;foo(); break;
}
</code></pre>
<p>Der Artikel stammt aus den 90er Jahren. MSCV2013 kennt keinen &quot;typeof&quot; Befehl. Gibt es ein heutiges aktuelles Äquivalent dazu? Kann mit MSVC2013 oder MSVC2015 ein Code mit der gleichen Funktion geschrieben werden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2471829</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471829</guid><dc:creator><![CDATA[mireiner]]></dc:creator><pubDate>Tue, 20 Oct 2015 17:54:20 GMT</pubDate></item><item><title><![CDATA[Reply to C++ typeof Äquivalent &#x2F; switch nach Objekttyp on Tue, 20 Oct 2015 17:58:58 GMT]]></title><description><![CDATA[<p>Ja, man kann das gleiche in modernem C++ erreichen, ist aber hochgradig kompliziert:</p>
<pre><code>foo();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2471831</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471831</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 20 Oct 2015 17:58:58 GMT</pubDate></item><item><title><![CDATA[Reply to C++ typeof Äquivalent &#x2F; switch nach Objekttyp on Tue, 20 Oct 2015 17:59:06 GMT]]></title><description><![CDATA[<p>Ich glaub', das lass lieber sein. Am Ende verwechselst du das gemeinte <code>typeof</code> noch mit <code>decltype</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2471832</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471832</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Tue, 20 Oct 2015 17:59:06 GMT</pubDate></item><item><title><![CDATA[Reply to C++ typeof Äquivalent &#x2F; switch nach Objekttyp on Tue, 20 Oct 2015 18:19:47 GMT]]></title><description><![CDATA[<p>mireiner schrieb:</p>
<blockquote>
<p>In dem PDF-Dokument: &quot;AN ENABLING OPTIMIZATION FOR C++ VIRTUAL FUNCTIONS&quot; (über <a href="http://google.de" rel="nofollow">google.de</a> suchen) wird &quot;switch&quot; mit &quot;typeof&quot; kombiniert</p>
</blockquote>
<p>Ich habe den Artikel nur überflogen aber wenn ich das richtig sehe dann ist das ein Vorschlag für eine Optimierung in den Compilern, nichts zum selbst programmieren bei jedem Funktionsaufruf. Dazu ist der Artikel von 1996. Falls diese Optimierung sinnvoll ist/war haben heutige Compiler das hoffentlich eingebaut.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2471836</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471836</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Tue, 20 Oct 2015 18:19:47 GMT</pubDate></item><item><title><![CDATA[Reply to C++ typeof Äquivalent &#x2F; switch nach Objekttyp on Tue, 20 Oct 2015 19:31:58 GMT]]></title><description><![CDATA[<p>&quot;typeid()&quot; ist der moderne Ersatz: <a href="https://msdn.microsoft.com/de-de/library/ms235260.aspx" rel="nofollow">https://msdn.microsoft.com/de-de/library/ms235260.aspx</a></p>
<p>Mit &quot;switch()&quot; funktioniert &quot;typeid()&quot; anscheinend nicht. Aber so geht es:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Tier
{
public:
	virtual void Fressen() {};
};

class Elster : public Tier
{
public:
	void Fressen()
	{
		cout &lt;&lt; &quot;Elster frisst\n&quot;;
	}
};

class Spinne : public Tier
{
	void Fressen()
	{
		cout &lt;&lt; &quot;Spinne frisst\n&quot;;
	}
};

class Raupe : public Tier
{
	void Fressen()
	{
		cout &lt;&lt; &quot;Raupe frisst\n&quot;;
	}
};

void main()
{
	Tier* t = new Spinne();

	if (typeid(*t) == typeid(Spinne))
		t-&gt;Fressen(); =&gt; &quot;Spinne frisst&quot;
	if (typeid(*t) == typeid(Elster))
		t-&gt;Fressen(); =&gt; &quot;Elster frisst&quot;
	if (typeid(*t) == typeid(Raupe))
		t-&gt;Fressen(); =&gt; &quot;Raupe frisst&quot;

	cin.get();
}
</code></pre>
<p>Das erpart beim &quot;switchen&quot; den &quot;Typ-Flag&quot;, der dann auch nicht mehr zugewiesen werden muss. Finde ich gut!</p>
<p>&quot;typeid()&quot; in Verbindung mit &quot;switch()&quot; wäre aber sicher noch performanter, weil nicht die ganzen if() Abfragen durchlaufen werden müssen. Hat jemand eine Idee, wie das mit &quot;switch()&quot; funktionieren könnte?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2471842</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471842</guid><dc:creator><![CDATA[mireiner]]></dc:creator><pubDate>Tue, 20 Oct 2015 19:31:58 GMT</pubDate></item><item><title><![CDATA[Reply to C++ typeof Äquivalent &#x2F; switch nach Objekttyp on Tue, 20 Oct 2015 18:44:11 GMT]]></title><description><![CDATA[<p>Ob das jetzt besser ist als eine virtuelle Funktion aufrufen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2471845</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471845</guid><dc:creator><![CDATA[Techel]]></dc:creator><pubDate>Tue, 20 Oct 2015 18:44:11 GMT</pubDate></item><item><title><![CDATA[Reply to C++ typeof Äquivalent &#x2F; switch nach Objekttyp on Tue, 20 Oct 2015 18:55:23 GMT]]></title><description><![CDATA[<p>Herr Intel hat doch ein Jahr nach dem Artikel den Prozessor gepimpt, der hat jetzt ca 50000 zusätzliche Transistoren verbaut, um virtuelle Funktionsaufrufe flott hinzukriegen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2471851</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471851</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 20 Oct 2015 18:55:23 GMT</pubDate></item><item><title><![CDATA[Reply to C++ typeof Äquivalent &#x2F; switch nach Objekttyp on Tue, 20 Oct 2015 18:59:44 GMT]]></title><description><![CDATA[<p>mireiner schrieb:</p>
<blockquote>
<p>Das erpart beim &quot;switchen&quot; den &quot;Typ-Flag&quot;, der dann auch nicht mehr zugewiesen werden muss. Finde ich gut!</p>
</blockquote>
<p>Und wo war da jetzt der Funktionsaufruf? Ich dachte du wolltest den virtual function call optimieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2471852</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471852</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Tue, 20 Oct 2015 18:59:44 GMT</pubDate></item><item><title><![CDATA[Reply to C++ typeof Äquivalent &#x2F; switch nach Objekttyp on Tue, 20 Oct 2015 19:06:53 GMT]]></title><description><![CDATA[<p>roflo schrieb:</p>
<blockquote>
<p>Ob das jetzt besser ist als eine virtuelle Funktion aufrufen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
</blockquote>
<p>&quot;Besser&quot; ist sicher eine Frage des Einzelfalls - bei meinem Programm zumindest 4% schneller (worauf ich aber verzichten kann), ABER die Rotationen laufen via &quot;switch&quot; nahezu ruckelfrei! Es ist das minimale &quot;Stottern&quot; der Grafikrotationen, das mich noch stört und die ich nicht wegbekommme. Eine gleichmäßig fliessende Grafikanimation ist schon was Feines, allein schon wegen der Ruhe die sie ausstrahlt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2471854</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471854</guid><dc:creator><![CDATA[mireiner]]></dc:creator><pubDate>Tue, 20 Oct 2015 19:06:53 GMT</pubDate></item><item><title><![CDATA[Reply to C++ typeof Äquivalent &#x2F; switch nach Objekttyp on Tue, 20 Oct 2015 19:02:06 GMT]]></title><description><![CDATA[<p>mireiner schrieb:</p>
<blockquote>
<p>&quot;typeid()&quot; in Verbindung mit &quot;wwitch&quot; wäre aber sicher noch performanter, weil nicht die ganzen if Abfragen durchlaufen werden müssen. Hat jemand eine Idee, wie das mit &quot;switch&quot; funktionieren könnte?</p>
</blockquote>
<p>Wie wäre es, wenn du der Basisklasse einen Methodenzeiger spendierst, der dann bei der Konstruktion einer abgeleiteten Klasse passend gesetzt wird? Dann bräuchten überhaupt keine Abfragen irgendeiner Art gemacht werden für den kleinen Preis von ein paar Byte Speicher.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2471855</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471855</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 20 Oct 2015 19:02:06 GMT</pubDate></item><item><title><![CDATA[Reply to C++ typeof Äquivalent &#x2F; switch nach Objekttyp on Tue, 20 Oct 2015 19:08:50 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Wie wäre es, wenn du der Basisklasse einen Methodenzeiger spendierst, der dann bei der Konstruktion einer abgeleiteten Klasse passend gesetzt wird? Dann bräuchten überhaupt keine Abfragen irgendeiner Art gemacht werden für den kleinen Preis von ein paar Byte Speicher.</p>
</blockquote>
<p>= virtuelle Methode</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2471856</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471856</guid><dc:creator><![CDATA[Techel]]></dc:creator><pubDate>Tue, 20 Oct 2015 19:08:50 GMT</pubDate></item><item><title><![CDATA[Reply to C++ typeof Äquivalent &#x2F; switch nach Objekttyp on Tue, 20 Oct 2015 19:08:25 GMT]]></title><description><![CDATA[<p>mireiner schrieb:</p>
<blockquote>
<p>roflo schrieb:</p>
<blockquote>
<p>Ob das jetzt besser ist als eine virtuelle Funktion aufrufen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
</blockquote>
<p>&quot;Besser&quot; ist sicher eine Frage des Einzelfalls - bei meinem Programm zumindest 4% schneller (worauf ich aber verzichten kann), ABER die Rotationen laufen via &quot;switch&quot; nahezu ruckelfrei! Es ist das minimale &quot;Stottern&quot; der Grafikrotationen, das mich noch stört und die ich nicht wegbekommme. Eine gleichmäßig fliessende Grafikanimation ist schon was Feines, allein schon wegen der Ruhe die sie ausstrahlt.</p>
</blockquote>
<p>Das Ruckeln liegt nicht daran.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2471857</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471857</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 20 Oct 2015 19:08:25 GMT</pubDate></item><item><title><![CDATA[Reply to C++ typeof Äquivalent &#x2F; switch nach Objekttyp on Tue, 20 Oct 2015 19:12:27 GMT]]></title><description><![CDATA[<p>roflo schrieb:</p>
<blockquote>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Wie wäre es, wenn du der Basisklasse einen Methodenzeiger spendierst, der dann bei der Konstruktion einer abgeleiteten Klasse passend gesetzt wird? Dann bräuchten überhaupt keine Abfragen irgendeiner Art gemacht werden für den kleinen Preis von ein paar Byte Speicher.</p>
</blockquote>
<p>= virtuelle Methode</p>
</blockquote>
<p>Fast. Ist eine Indirektion weniger.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2471859</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471859</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Tue, 20 Oct 2015 19:12:27 GMT</pubDate></item><item><title><![CDATA[Reply to C++ typeof Äquivalent &#x2F; switch nach Objekttyp on Tue, 20 Oct 2015 19:13:54 GMT]]></title><description><![CDATA[<p>Stimmt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2471860</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471860</guid><dc:creator><![CDATA[Techel]]></dc:creator><pubDate>Tue, 20 Oct 2015 19:13:54 GMT</pubDate></item><item><title><![CDATA[Reply to C++ typeof Äquivalent &#x2F; switch nach Objekttyp on Tue, 20 Oct 2015 19:20:40 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Wie wäre es, wenn du der Basisklasse einen Methodenzeiger spendierst, der dann bei der Konstruktion einer abgeleiteten Klasse passend gesetzt wird? Dann bräuchten überhaupt keine Abfragen irgendeiner Art gemacht werden für den kleinen Preis von ein paar Byte Speicher.</p>
</blockquote>
<p>Das hört sich fantastisch an! Aber ehrlich gesagt, komme ich da an meine Grenzen. Habe keine Ahnung, wie das programmiert werden kann. Könntest Du vielleicht ein lauffähiges Minimal-Beispiel zeigen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2471861</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471861</guid><dc:creator><![CDATA[mireiner]]></dc:creator><pubDate>Tue, 20 Oct 2015 19:20:40 GMT</pubDate></item><item><title><![CDATA[Reply to C++ typeof Äquivalent &#x2F; switch nach Objekttyp on Tue, 20 Oct 2015 19:24:07 GMT]]></title><description><![CDATA[<p>sebi707 schrieb:</p>
<blockquote>
<p>roflo schrieb:</p>
<blockquote>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Wie wäre es, wenn du der Basisklasse einen Methodenzeiger spendierst, der dann bei der Konstruktion einer abgeleiteten Klasse passend gesetzt wird? Dann bräuchten überhaupt keine Abfragen irgendeiner Art gemacht werden für den kleinen Preis von ein paar Byte Speicher.</p>
</blockquote>
<p>= virtuelle Methode</p>
</blockquote>
<p>Fast. Ist eine Indirektion weniger.</p>
</blockquote>
<p>Welche aber nichts kosten würde unter der Annahme, daß die Speicherseiten mit den VTBLs heiß bleiben und es einen Call-Befehl gäbe, der den Tabellen-Nachkucker gleich in einem Aufwasch mitmachen könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2471863</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471863</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 20 Oct 2015 19:24:07 GMT</pubDate></item><item><title><![CDATA[Reply to C++ typeof Äquivalent &#x2F; switch nach Objekttyp on Tue, 20 Oct 2015 20:09:35 GMT]]></title><description><![CDATA[<p>mireiner schrieb:</p>
<blockquote>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Wie wäre es, wenn du der Basisklasse einen Methodenzeiger spendierst, der dann bei der Konstruktion einer abgeleiteten Klasse passend gesetzt wird? Dann bräuchten überhaupt keine Abfragen irgendeiner Art gemacht werden für den kleinen Preis von ein paar Byte Speicher.</p>
</blockquote>
<p>Das hört sich fantastisch an! Aber ehrlich gesagt, komme ich da an meine Grenzen. Habe keine Ahnung, wie das programmiert werden kann. Könntest Du vielleicht ein lauffähiges Minimal-Beispiel zeigen?</p>
</blockquote>
<p>Ja, das Minimalbeispiel ist ganz einfach: virtual. Das ist ja gerade der ganze Witz. Du brichst dir hier einen ab für seit 20 Jahren veraltete Optimierungen.</p>
<p>Hör auf volkard!</p>
<p>volkard schrieb:</p>
<blockquote>
<p>Das Ruckeln liegt nicht daran.</p>
</blockquote>
<p>Da hat volkard sicher recht. Ich bezweifle auch sehr deine Messmethode, wenn du behauptest, 4% gegenüber der Implementierung von virtuellen Methoden deines Compilers gewonnen zu haben. Das schaffst du ganz sicher nicht mit typeid/typeof &amp; Co. Denn was glaubst du wohl, wie typeid und Konsorten implementiert sind?</p>
<p>Zeig lieber dein eigentliches Problem, also das Ruckeln, und frag, wie man das flüssig hin bekommt. Wobei das Problem eventuell im Spiele- und Grafikforum besser aufgehoben sein könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2471879</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471879</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 20 Oct 2015 20:09:35 GMT</pubDate></item><item><title><![CDATA[Reply to C++ typeof Äquivalent &#x2F; switch nach Objekttyp on Wed, 21 Oct 2015 00:47:32 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/29726">@mireiner</a><br />
Damit das ganze ne Chance hat 'was zu bringen darf der Aufruf nicht indirekt erfolgen - die Methode muss &quot;direkt&quot; aufgerufen werden. Damit sie inline erweitert werden kann. Denn nur dort sind die wirklich mächtigen Optimierungen zu Hause.</p>
<p>Das kannst du erreichen durch<br />
* Einen mächtig schlauen Compiler der mächtig schlau Devirtualization betreiben kann, und ausreichend Glück dass er es an der Stelle wo du es brauchst auch macht.<br />
* Einen mächtig schlauen Compiler den du mit Profile-Guided-Optimization unterstützt + immer noch ein gutes Stück Glück.<br />
* Die <code>switch-case</code> Variante.</p>
<p>Ein Methodenzeiger bringt nichts, da hier der Aufruf erst wieder indirekt erfolgt, also kein Inlining möglich ist (zumindest praktisch nicht, auch wenn auch hier ein Compiler theoretisch optimieren könnte).</p>
<p>Auf den mächtig schlauen Compiler würde ich mich nicht verlassen wollen.</p>
<p>Bleibt also noch die <code>switch-case</code> Variante.</p>
<p>Dabei ist natürlich wichtig dass du an das auf was du <code>switch</code> -st möglichst schnell dran kommst. Lösung: pack nen <code>int</code> in die Basisklasse.</p>
<pre><code class="language-cpp">switch (m_myType) 
{ 
case Base::MyType: 
     Base::foo(); break; 
case Sub1::MyType:
     static_cast&lt;Sub1*&gt;(this)-&gt;Sub1::foo(); break; 
case Sub2::MyType:
     static_cast&lt;Sub2*&gt;(this)-&gt;Sub2::foo(); break; 
default:
     this-&gt;foo(); break; 
}
</code></pre>
<p>Bloss ... dummerweise wird volkard vermutlich Recht haben. Das Ruckeln wird wohl nicht dort verursacht werden. Und dann kannst du es dort natürlich auch nicht beheben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2471915</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471915</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 21 Oct 2015 00:47:32 GMT</pubDate></item><item><title><![CDATA[Reply to C++ typeof Äquivalent &#x2F; switch nach Objekttyp on Wed, 21 Oct 2015 00:53:02 GMT]]></title><description><![CDATA[<p>sebi707 schrieb:</p>
<blockquote>
<p>wenn ich das richtig sehe dann ist das ein Vorschlag für eine Optimierung in den Compilern, nichts zum selbst programmieren bei jedem Funktionsaufruf. Dazu ist der Artikel von 1996. Falls diese Optimierung sinnvoll ist/war haben heutige Compiler das hoffentlich eingebaut.</p>
</blockquote>
<p>Ja. Ist drin, sollte alle &quot;grossen&quot; aktuellen Compiler können (MSVC, GCC, Clang, Intel)<br />
Nennt sich Devirtualization.<br />
Ist aber natürlich, wie viele Optimierungen, nix worauf man sich 100% verlassen kann. Wenns um die Wurst geht darf man sowas in 1-2 Funktionen ruhig mal selbst machen. Geht bloss meist nicht um die Wurst <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/2471916</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471916</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 21 Oct 2015 00:53:02 GMT</pubDate></item><item><title><![CDATA[Reply to C++ typeof Äquivalent &#x2F; switch nach Objekttyp on Wed, 21 Oct 2015 01:01:34 GMT]]></title><description><![CDATA[<p>Das erinnert mich an das oft vergessene C++11-Feature <a href="http://en.cppreference.com/w/cpp/language/final" rel="nofollow">final</a>, mit dem man dem optimierenden Compiler die Annahmen garantieren kann (die dann hoffentlich auch stimmen!), die er braucht, um diese Optimierung unbekümmert durchführen zu können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2471917</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471917</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 21 Oct 2015 01:01:34 GMT</pubDate></item><item><title><![CDATA[Reply to C++ typeof Äquivalent &#x2F; switch nach Objekttyp on Wed, 21 Oct 2015 01:32:45 GMT]]></title><description><![CDATA[<p>Bringt <code>final</code> da wirklich was?</p>
<p>Der üblicher Fall ist doch dass die Stelle wo der kritische Aufruf steht eben gerade nicht in der <code>final</code> Klasse ist (bzw. nicht in der Klasse wo die aufgerufene Funktion <code>final</code> wird).</p>
<p>Und dann bringt es dem Compiler schätze ich nicht viel zu wissen dass bestimmte abgeleitete Klassen <code>final</code> wären.</p>
<p>Er muss also trotzdem ein <code>if (this-&gt;vtbl-&gt;fun[123] == &amp;Derived1::Fun)</code> o.Ä. reinknallen. Und das reicht auch ohne <code>final</code> .</p>
<p>Die schwierigen Fragen für den Compiler sind denke ich eher: wo zahl sich das überhaupt aus und welche abgeleiteten Klassen sollten als Kandidaten geprüft werden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2471920</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471920</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 21 Oct 2015 01:32:45 GMT</pubDate></item><item><title><![CDATA[Reply to C++ typeof Äquivalent &#x2F; switch nach Objekttyp on Wed, 21 Oct 2015 01:57:38 GMT]]></title><description><![CDATA[<p>Wenn du den Fall, in dem final in diesem Zusammenhang etwas bringen würde, als unrealistisch weg definierst (womit du aber durchaus Recht haben magst), dann bringt es natürlich nichts <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/2471922</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471922</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 21 Oct 2015 01:57:38 GMT</pubDate></item><item><title><![CDATA[Reply to C++ typeof Äquivalent &#x2F; switch nach Objekttyp on Wed, 21 Oct 2015 02:25:18 GMT]]></title><description><![CDATA[<p>Also, final bringt nur dann was, wenn der Compiler den most derived type nicht kennt, aber trotzdem noch Zusatzinformationen hat.</p>
<p>Also z.B. hier:</p>
<pre><code>Base* base=createObject();
static_cast&lt;Derived*&gt;(base)-&gt;foo();
</code></pre>
<p>Ohne final in Derived::foo() resultiert das trotzdem in einen virtuellen Funktionsaufruf, mit final kann Derived::foo() direkt aufgerufen werden.</p>
<p>Wenn man <code>static_cast&lt;Derived*&gt;(base)-&gt;Derived::foo()</code> schreibt, ist's eh egal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2471923</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471923</guid><dc:creator><![CDATA[;qwerty]]></dc:creator><pubDate>Wed, 21 Oct 2015 02:25:18 GMT</pubDate></item><item><title><![CDATA[Reply to C++ typeof Äquivalent &#x2F; switch nach Objekttyp on Wed, 21 Oct 2015 02:59:18 GMT]]></title><description><![CDATA[<p>;qwerty schrieb:</p>
<blockquote>
<p>Wenn man <code>static_cast&lt;Derived*&gt;(base)-&gt;Derived::foo()</code> schreibt, ist's eh egal.</p>
</blockquote>
<p>Ich denke typisch ist eher der Fall <code>base-&gt;foo()</code> .<br />
Und da bringt <code>final</code> wohl auch wenig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2471924</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471924</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 21 Oct 2015 02:59:18 GMT</pubDate></item><item><title><![CDATA[Reply to C++ typeof Äquivalent &#x2F; switch nach Objekttyp on Wed, 21 Oct 2015 04:16:38 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Bringt <code>final</code> da wirklich was?</p>
</blockquote>
<p>Sobald der Compiler alle Blätter kennt, kann er switch machen.</p>
<p>Das sehe ich jetzt eigentlich nur, wenn man eine Library als DLL zur Verfügung stellt. Ohne final kann man in der DLL keine Blätter haben (in der EXE schon).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2471925</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2471925</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 21 Oct 2015 04:16:38 GMT</pubDate></item><item><title><![CDATA[Reply to C++ typeof Äquivalent &#x2F; switch nach Objekttyp on Wed, 21 Oct 2015 13:52:09 GMT]]></title><description><![CDATA[<p>volkard, ich hab keine Ahnung was du meinst.</p>
<p>Wieso sollte es wichtig sein zu wissen was Blätter sind und was nicht?<br />
Und wieso sollte man das wissen müssen damit der Compiler &quot;switch machen&quot; kann? Der Compiler kann immer &quot;switch machen&quot;, er muss nur im Normalfall einen <code>default</code> Zweig einbauen der den Aufruf ganz normal über den Vtable macht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2472013</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2472013</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 21 Oct 2015 13:52:09 GMT</pubDate></item></channel></rss>