<?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[Warum ist rtti so langsam?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich will gerade in einem Projekt die rtti verwenden, und verstehe einfach nicht, warum sie so langsam ist. Hier ein simpler Test typeid == typeid vs int == int:</p>
<pre><code class="language-cpp">#include &lt;ctime&gt;
#include &lt;iostream&gt;
#include &lt;typeinfo&gt;

const unsigned int loops = 100000000;

int main()
{
    volatile unsigned int a = 1;
	volatile unsigned int b = 2;

	unsigned int dummy = 0;

	unsigned int t = std::clock();
	for( unsigned int i = 0 ; i &lt; loops ; ++i )
	{
		if( a == b )
			++dummy;
	}
	std::cout&lt;&lt; std::clock() - t &lt;&lt;std::endl;

	t = std::clock();
	for( unsigned int i = 0 ; i &lt; loops ; ++i )
	{
		if( typeid( int ) == typeid( double ) )
			++dummy;
	}
	std::cout&lt;&lt; std::clock() - t &lt;&lt;std::endl;

	std::cin.get();
}
</code></pre>
<p>Auf meinem Rechner ist die Ausgabe<br />
- mit VC++2010 release: 209 ; 1932<br />
- mit mingw und gcc -03: 190 ; 1979</p>
<p>Warum ist das so? Müsste ich rtti selbst bauen, würde ich typeid einfach als einzigartigen uint Wert umsetzen.<br />
Warum schneidet typeid also auf den beiden compilern (ich nehme mal an, dass das bei anderen nicht viel anders sein wird) so viel schlechter ab? Und warum optimiert keiner der beiden compiler die zweite Schleife einfach weg?</p>
<p>EDIT: Ich glaube ich habe grade herausgefunden, warum es so lahm ist: Anscheinend Vergleichen die beiden compiler die Namen der beiden types miteinander, d.h. strcmp. Das erscheint mir doch ziemlich seltsam. Warum sollte man sowas machen? Nur damit typeid auch über dll Grenzen funktioniert? Dafür muss es doch wohl bessere Lösungen geben als sowas unsicheres - was ist wenn verschiedene Typen gleich heißen? Bin ernsthaft etwas verwirrt <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/topic/293174/warum-ist-rtti-so-langsam</link><generator>RSS for Node</generator><lastBuildDate>Sun, 16 Aug 2026 10:44:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/293174.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 26 Sep 2011 20:46:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Warum ist rtti so langsam? on Mon, 26 Sep 2011 21:04:47 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich will gerade in einem Projekt die rtti verwenden, und verstehe einfach nicht, warum sie so langsam ist. Hier ein simpler Test typeid == typeid vs int == int:</p>
<pre><code class="language-cpp">#include &lt;ctime&gt;
#include &lt;iostream&gt;
#include &lt;typeinfo&gt;

const unsigned int loops = 100000000;

int main()
{
    volatile unsigned int a = 1;
	volatile unsigned int b = 2;

	unsigned int dummy = 0;

	unsigned int t = std::clock();
	for( unsigned int i = 0 ; i &lt; loops ; ++i )
	{
		if( a == b )
			++dummy;
	}
	std::cout&lt;&lt; std::clock() - t &lt;&lt;std::endl;

	t = std::clock();
	for( unsigned int i = 0 ; i &lt; loops ; ++i )
	{
		if( typeid( int ) == typeid( double ) )
			++dummy;
	}
	std::cout&lt;&lt; std::clock() - t &lt;&lt;std::endl;

	std::cin.get();
}
</code></pre>
<p>Auf meinem Rechner ist die Ausgabe<br />
- mit VC++2010 release: 209 ; 1932<br />
- mit mingw und gcc -03: 190 ; 1979</p>
<p>Warum ist das so? Müsste ich rtti selbst bauen, würde ich typeid einfach als einzigartigen uint Wert umsetzen.<br />
Warum schneidet typeid also auf den beiden compilern (ich nehme mal an, dass das bei anderen nicht viel anders sein wird) so viel schlechter ab? Und warum optimiert keiner der beiden compiler die zweite Schleife einfach weg?</p>
<p>EDIT: Ich glaube ich habe grade herausgefunden, warum es so lahm ist: Anscheinend Vergleichen die beiden compiler die Namen der beiden types miteinander, d.h. strcmp. Das erscheint mir doch ziemlich seltsam. Warum sollte man sowas machen? Nur damit typeid auch über dll Grenzen funktioniert? Dafür muss es doch wohl bessere Lösungen geben als sowas unsicheres - was ist wenn verschiedene Typen gleich heißen? Bin ernsthaft etwas verwirrt <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/2124086</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2124086</guid><dc:creator><![CDATA[GorbGorb]]></dc:creator><pubDate>Mon, 26 Sep 2011 21:04:47 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist rtti so langsam? on Mon, 26 Sep 2011 21:02:49 GMT]]></title><description><![CDATA[<p>typeid muss per Standard ein type_info-Objekt zurückliefern, mit einfachem int wird das also nichts. Auch bekäme man Probleme damit, die typeids verschiedener Bibliotheken getrennt zu halten.</p>
<p>Überhaupt führt die Existenz von Laufzeitlinkern (d.h. dlopen/LoadLibrary etc.) hier unter Umständen zu gewissen Schwierigkeiten. Vermutlich benutzt die GNU-Implementation folgende Variante des operator==:</p>
<pre><code class="language-cpp">bool operator==(const type_info&amp; __arg) const
    {
      return ((__name == __arg.__name)
              || (__name[0] != '*' &amp;&amp;
                  __builtin_strcmp (__name, __arg.__name) == 0));
    }
</code></pre>
<p>Übersetz den Code mal mit</p>
<pre><code class="language-cpp">if( typeid( int ) == typeid( int ) )
</code></pre>
<p>. Wahrscheinlich fällt der Unterschied dann wesentlich kleiner aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2124096</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2124096</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Mon, 26 Sep 2011 21:02:49 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist rtti so langsam? on Mon, 26 Sep 2011 21:04:05 GMT]]></title><description><![CDATA[<p>Najo, bei typeid wird wohl immer ein Lookup gemacht werden, mitsamt den ganzen Folgen (Tables nicht im Cache etc)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2124097</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2124097</guid><dc:creator><![CDATA[Ethon__]]></dc:creator><pubDate>Mon, 26 Sep 2011 21:04:05 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist rtti so langsam? on Mon, 26 Sep 2011 21:26:53 GMT]]></title><description><![CDATA[<p>Ok, muss mich nochmal verbessern:<br />
In VC++ scheinen die Kosten für typeid == typeid unabhängig davon, ob die beiden Typen gleich sind, mit der Länge der Namen zuzunehmen.<br />
In gcc scheint die Dauer für operator== konstant zu bleiben, d.h. ist unabhängig von der Länge des Namens. Dafür halbiert sich die Dauer aber in etwa, wenn die beiden Typen gleich sind.<br />
Das Verhalten von VC++ kann ich ja nachvollziehen (finde es aber nicht so toll), aber was der gcc intern macht bleibt mir ein Rätsel.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2124112</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2124112</guid><dc:creator><![CDATA[GorbGorb]]></dc:creator><pubDate>Mon, 26 Sep 2011 21:26:53 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist rtti so langsam? on Mon, 26 Sep 2011 21:59:29 GMT]]></title><description><![CDATA[<p>Naja, zunächst mal verwendet der gcc dem vendor-neutral C++ ABI entsprechende Namen, d.h. zum Beispiel: typeid(double).name() ist nicht &quot;double&quot;, sondern &quot;d&quot;. Wenn es zu einem String-Vergleich kommt, werden Basistypen und einige Typen aus der Standardbibliothek also praktisch sonderbehandelt.</p>
<p>Ich vermute aber, dass in derart einfachem Code ohne dynamisch dazugeladene Komponenten die Bedingung __name[0] != '*' nie hält und im Ungleichheitsfall unabhängig vom Namen der betreffenden Typen immer nur die Zeiger verglichen und über das erste Zeichen des Namens festgestellt wird, dass ein String-Vergleich einen auch nicht weiterbrächte. Ich hätte jetzt nicht zwingend vorhergesagt, dass das in der Performance einen Faktor von 2 ausmacht, aber etwas in der Größenordnung scheint realistisch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2124117</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2124117</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Mon, 26 Sep 2011 21:59:29 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist rtti so langsam? on Mon, 26 Sep 2011 23:53:27 GMT]]></title><description><![CDATA[<p>Dass type_info Vergleiche so oft so langsam sind, liegt eigentlich nur daran, dass viele Compiler die ABI nicht völlig frei wählen/definieren können, bzw. es aus bestimmten Gründen nicht wollen.<br />
MSVC versucht nicht all zu oft mit &quot;seiner&quot; eigenen ABI zu brechen, und GCC möchte gern die &quot;Vendor-Neutral C++ ABI&quot; verwenden.</p>
<p>Sonst könnte man z.B. inetwa sowas machen:</p>
<pre><code class="language-cpp">struct _TypeInfoData
{
    long long _HashCode;   // Hashcode von _TypeName, nach irgendeinem genau definierten, schlauen Algorithmus
    char const* _TypeName; // Zero-padded auf z.B. Vielfache von 8 Byte
};

class type_info
{
public:
    // ...

    bool operator == (type_info const&amp; other) const
    {
        if (other._Data == _Data)
            return true;  // Adresse gleich -&gt; muss gleicher Typ sein
        else if (other._Data-&gt;_HashCode != _Data-&gt;HashCode)
            return false; // Hashcode unterschiedlich -&gt; muss anderer Typ sein
        else
                          // Doof, wir müssen vergleichen
            return fast_8b_padded_strcmp(other._Data-&gt;_TypeName, _Data-&gt;_TypeName) == 0;
    }

    // Analog dazu operator != () und before()

private:
    type_info(_TypeInfoData const* data) : _Data(data) {}

    type_info(type_info const&amp;);
    type_info&amp; operator =(type_info const&amp;);

    _TypeInfoData const* _Data;
};
</code></pre>
<p>Ein wirklicher String-Vergleich wäre damit nur mehr in einigen wenigen Fällen nötig (=wenn die _TypeInfoData Instanzen in verschiedenen DLLs/SOs stehen, der Typ aber der selbe ist, oder wenn man sehr sehr viel Pech mit dem Hashcode hat).</p>
<p>Macht aber (fast?) keiner, weil keiner mit &quot;seiner&quot; ABI brechen will. Über ähnliche Mechanismen liesse sich vermutlich auch dynamic_cast etwas beschleunigen. Macht aber auch (fast?) keiner.</p>
<p>-----</p>
<p>BTW: nachdem ich gerade es sebst ergoogelt habe, und nicht uninteressant finde: die &quot;Vendor-Neutral C++ ABI&quot; die GCC verwendet ist die, die ursprünglich für Itanium definiert wurde, und ist (laut Wikipedia) hier dokumentiert:</p>
<p><a href="http://sourcery.mentor.com/public/cxx-abi/abi.html" rel="nofollow">http://sourcery.mentor.com/public/cxx-abi/abi.html</a><br />
<a href="http://sourcery.mentor.com/public/cxx-abi/abi-eh.html" rel="nofollow">http://sourcery.mentor.com/public/cxx-abi/abi-eh.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2124142</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2124142</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 26 Sep 2011 23:53:27 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist rtti so langsam? on Tue, 27 Sep 2011 00:05:34 GMT]]></title><description><![CDATA[<p>Kann ich übrigens nicht nachvollziehen, gcc 4.5 und 4.6 optimieren die zweite Schleife vollständig weg (und die dummy-Variable auch).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2124144</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2124144</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Tue, 27 Sep 2011 00:05:34 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist rtti so langsam? on Tue, 27 Sep 2011 12:10:15 GMT]]></title><description><![CDATA[<p>Danke für die Erklärungen,<br />
ich werde dann meine eigene rtti mit uints verwenden, mit der Möglichkeit für dlls auf die eingebaute rtti zurückzufallen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2124299</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2124299</guid><dc:creator><![CDATA[GorbGorb]]></dc:creator><pubDate>Tue, 27 Sep 2011 12:10:15 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist rtti so langsam? on Tue, 27 Sep 2011 12:16:46 GMT]]></title><description><![CDATA[<p>Hast du Optimierung angeschaltet?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2124302</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2124302</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 27 Sep 2011 12:16:46 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist rtti so langsam? on Tue, 27 Sep 2011 12:20:18 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>Hast du Optimierung angeschaltet?</p>
</blockquote>
<p>ja -O3 bzw halt die normalen release Einstellungen von msvc++.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2124307</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2124307</guid><dc:creator><![CDATA[GorbGorb]]></dc:creator><pubDate>Tue, 27 Sep 2011 12:20:18 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist rtti so langsam? on Tue, 27 Sep 2011 13:39:03 GMT]]></title><description><![CDATA[<p>Natürlich ist es interessant wie RTTI vom Compiler umgesetzt wird, aber ich würde mir an deiner Stelle vor allem überlegen, warum genau ich eigentlich RTTI verwenden will und was ich besser machen kann, sodass ich ohne auskomm...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2124342</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2124342</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Tue, 27 Sep 2011 13:39:03 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist rtti so langsam? on Tue, 27 Sep 2011 19:24:33 GMT]]></title><description><![CDATA[<p>Ich habe nicht vor eine dynamic_cast oder typeid Orgie anzurichten, keine Sorge.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2124480</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2124480</guid><dc:creator><![CDATA[GorbGorb]]></dc:creator><pubDate>Tue, 27 Sep 2011 19:24:33 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist rtti so langsam? on Tue, 27 Sep 2011 20:28:29 GMT]]></title><description><![CDATA[<p>Orgie der Gewalt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2124511</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2124511</guid><dc:creator><![CDATA[invalid_cast&amp;lt;&amp;gt;]]></dc:creator><pubDate>Tue, 27 Sep 2011 20:28:29 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist rtti so langsam? on Tue, 27 Sep 2011 21:27:35 GMT]]></title><description><![CDATA[<p>GorbGorb schrieb:</p>
<blockquote>
<p>Ich habe nicht vor eine dynamic_cast oder typeid Orgie anzurichten, keine Sorge.</p>
</blockquote>
<p>Es ist aber sehr wahrscheinlich, dass du gerade dabei bist, dir basierend auf <code>typeid</code> einfach nur eine Art <code>dynamic_cast</code> zu basteln, auch wenns auf den ersten Blick vielleicht nicht direkt danach aussieht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2124521</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2124521</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Tue, 27 Sep 2011 21:27:35 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist rtti so langsam? on Tue, 27 Sep 2011 22:15:49 GMT]]></title><description><![CDATA[<p>dot schrieb:</p>
<blockquote>
<p>GorbGorb schrieb:</p>
<blockquote>
<p>Ich habe nicht vor eine dynamic_cast oder typeid Orgie anzurichten, keine Sorge.</p>
</blockquote>
<p>Es ist aber sehr wahrscheinlich, dass du gerade dabei bist, dir basierend auf <code>typeid</code> einfach nur eine Art <code>dynamic_cast</code> zu basteln, auch wenns auf den ersten Blick vielleicht nicht direkt danach aussieht...</p>
</blockquote>
<p>Wobei dynamic_cast auch nicht unbedingt schneller sein wird als typeid()...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2124542</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2124542</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 27 Sep 2011 22:15:49 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist rtti so langsam? on Tue, 27 Sep 2011 22:24:16 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>dot schrieb:</p>
<blockquote>
<p>GorbGorb schrieb:</p>
<blockquote>
<p>Ich habe nicht vor eine dynamic_cast oder typeid Orgie anzurichten, keine Sorge.</p>
</blockquote>
<p>Es ist aber sehr wahrscheinlich, dass du gerade dabei bist, dir basierend auf <code>typeid</code> einfach nur eine Art <code>dynamic_cast</code> zu basteln, auch wenns auf den ersten Blick vielleicht nicht direkt danach aussieht...</p>
</blockquote>
<p>Wobei dynamic_cast auch nicht unbedingt schneller sein wird als typeid()...</p>
</blockquote>
<p>Normalerweise dürfte sogar eher das Gegenteil der Fall sein, da <code>dynamic_cast</code> die komplette Hierarchie beachten muss...<br />
Aber darum gehts mir auch nicht. Mir geht's darum, dass <code>typeid</code> und <code>dynamic_cast</code> meist Sympton eines Designproblems sind. Es wäre also sinnvoll, zumindest mal zu reflektieren, was man da eigentlich gerade zu tun gedenkt, anstatt mit dem Kopf durch die Wand zu laufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2124545</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2124545</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Tue, 27 Sep 2011 22:24:16 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist rtti so langsam? on Tue, 27 Sep 2011 22:29:06 GMT]]></title><description><![CDATA[<p>Ich will component based design umsetzen, d.h. ich brauche eine Klasse &quot;entity&quot; die beliebige Komponententypen aufnehmen kann (und twar nicht immer die gleichen).<br />
Das könnte ich jetzt so machen, dass etwas baue wie <code>entity&lt; ComponentA , ComponentB , ComponentC &gt;</code> . Das wird aber dann nicht mehr funktionieren, wenn ich zur Laufzeit neue entity &quot;Arten&quot; erstellen will (z.B. weil ich eine Datei einlese, in der festgelegt ist, welche components zu einer entity gehören). Und dazu brauche ich rtti. Das wird nur im framework verwendet, in der Logik für mein Programm brauche ich es nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2124546</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2124546</guid><dc:creator><![CDATA[GorbGorb]]></dc:creator><pubDate>Tue, 27 Sep 2011 22:29:06 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist rtti so langsam? on Tue, 27 Sep 2011 23:20:42 GMT]]></title><description><![CDATA[<p>Wo genau brauchst du dabei RTTI für was genau? <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/2124563</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2124563</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 27 Sep 2011 23:20:42 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist rtti so langsam? on Wed, 28 Sep 2011 06:24:02 GMT]]></title><description><![CDATA[<p>Ich übergebe diese entity einem entity_system, das Komponenten in Abhängigkeit von ihrem Typ an spezielle container weitergibt:</p>
<p>entity -&gt; entity_system -&gt; (über virtuelle Funktion) -&gt; meta_entity_system&lt;...&gt; (kennt den Typ der folgenden container) -&gt; container&lt; ComponentType* &gt;</p>
<p>entity_system weiß noch nicht, für welche Typen es container gibt. Dadurch muss ich nicht alles, das entity_system verwendet, neu compilen, wenn ich einen neuen Komponententyp einbaue.<br />
In meta_entity_system muss ich dann aber wissen, welche Komponententypen in der entity stecken, also brauche ich rtti.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2124599</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2124599</guid><dc:creator><![CDATA[GorbGorb]]></dc:creator><pubDate>Wed, 28 Sep 2011 06:24:02 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist rtti so langsam? on Wed, 28 Sep 2011 09:54:00 GMT]]></title><description><![CDATA[<p>Nurmal rein prinzipiell: Wie kann deine Anwendung was mit einer zur Compiletime der Anwendung unbekannten Schnittstelle anfangen?</p>
<p>Edit: Ok, es könnte eine neue Komponente was mit einer neuen Schnittstellen anfangen. RTTI wäre da theoretisch eine Lösung, wird praktisch aber schon rein auf technischer Ebene nicht unproblematisch sein, da die Typen, mit denen du es da zu tun hast, wohl aus verschiedenen dlls stammen müssen. Fakt ist, dass Code nur Schnittstellen verwenden kann, die zur Compiletime bekannt sind. Ich denk, dass es da eine bessere Lösung geben muss. Ich frag mich eben grad, was genau der Sinn davon ist, die Komponenten zentral zu verwalten, wenn es doch offenbar an zentraler Stelle nicht genug Information dafür geben kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2124645</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2124645</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Wed, 28 Sep 2011 09:54:00 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist rtti so langsam? on Wed, 28 Sep 2011 11:13:48 GMT]]></title><description><![CDATA[<p>Zumal Zentralisierung der grundlegenden Idee des komponentenbasierten Designs völlig zuwiderläuft. Man will da doch eigentlich erreichen, dass die Komponenten ihre jeweilige Implementation untereinander überhaupt nicht kennen müssen. Auch sehe ich nicht, wie du Komponenten in Klassen quetschen willst, wenn CBSE sich von Objektorientierung genau dadurch abgrenzt, dass eine Schnittstelle auch von etwas anderem als Objekten getragen werden kann (wie Funktionen, Sockets oder was auch immer).</p>
<p>Geht es dir um eine Art Framework zur Verwaltung von Metadaten, d.h. Abhängigkeitsauflösung zur Laufzeit? Das wäre vorstellbar, aber dafür solltest du keine Typidentifikation zur Laufzeit brauchen. Das ginge wahrscheinlich sogar ohne virtuelle Methoden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2124689</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2124689</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Wed, 28 Sep 2011 11:13:48 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist rtti so langsam? on Wed, 28 Sep 2011 14:12:57 GMT]]></title><description><![CDATA[<p>Es geht mir nicht primär um dlls, sondern darum dass ich code nicht ständig neu compilen will. Vielleicht kams nicht ganz so klar rüber: Ich kenne die Typen aller Komponenten beim compilen, aber nicht alle Kombinationen (naja, rein theoretisch wäre das schon möglich, aber ich bezweifle, dass es sinnvoll ist, beim compilen schon alles mit allem zu kombinieren, weil das ziemlich schnell sehr viele Möglichkeiten werden).<br />
@seldon: Irgendwo muss ich meiner entity sagen, welche Komponenten zu ihr gehören. Danach werden die Komponenten dann aber auf getrennte container aufgeteilt. Da Komponenten bei mir allein aus Daten bestehen und von mehreren subsystems für jeweils einen bestimmten Komponententyp bearbeitet werden, weiß ich auch nicht, was du mit Schnittstellen genau meinst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2124757</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2124757</guid><dc:creator><![CDATA[GorbGorb]]></dc:creator><pubDate>Wed, 28 Sep 2011 14:12:57 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist rtti so langsam? on Wed, 28 Sep 2011 16:45:03 GMT]]></title><description><![CDATA[<p>Wahrscheinlich reden wir gerade völlig aneinander vorbei. Ich rede <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Component-based_software_engineering" rel="nofollow">hiervon</a>.</p>
<p>So richtig klar ist mir nicht, was du unter &quot;componend based design&quot; verstehst; wenn Komponenten bei dir bloß Daten sind, ist es jedenfalls nicht das, was ich meinte. Kannst du vielleicht etwas genauer beschreiben, was du eigentlich <em>erreichen</em> willst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2124802</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2124802</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Wed, 28 Sep 2011 16:45:03 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist rtti so langsam? on Wed, 28 Sep 2011 19:35:07 GMT]]></title><description><![CDATA[<p>Ok stimmt, ich meine was anderes:<br />
-&gt; <a href="http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/" rel="nofollow">http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/</a></p>
<p>Im Grunde geht es darum, dass man statt mit einer Klassenhierarchie mit aus mehreren Komponenten zusammengesetzten Objekten (entities) arbeitet. Eine entity ist nur eine einzigartie id, der mehrere Komponenten zugeordnet sind.<br />
Die Komponenten werden dann seperat voneinder gespeichert. Da Komponenten nur aus Daten bestehen werden sie von einem bestimmten subsystem bearbeitet. Wie aus dem Artikel hervorgeht, wird das bei der Spieleprogrammierung verwendet.<br />
Als Beispiel könnte etwa eine entity einen Baum im Spiel repräsentieren. Die entity hätte dann eine RenderComponent, eine PhysicsComponent, DestructibleComponent, ...<br />
Es gäbe ein RenderSystem, das alle RenderComponents abarbeitet, ein PhysicsSystem für die Physik etc.<br />
Der Vorteil ist, dass man damit verschiedene Aspekte trennen kann, statt sie in einem großen god object zu verwursteln. Abgesehen von weniger schmutzigem code kann man so leichter multi threaden und nutzt den cache durch seperate Speicherung der Komponenten besser.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2124870</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2124870</guid><dc:creator><![CDATA[GorbGorb]]></dc:creator><pubDate>Wed, 28 Sep 2011 19:35:07 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist rtti so langsam? on Wed, 28 Sep 2011 21:13:10 GMT]]></title><description><![CDATA[<p>Hmm...okay, da muss ich jetzt ein bisschen vorsichtig sein, weil ich keinerlei Erfahrung mit solchen Systemen habe. Wenn ich den Artikel richtig verstehe, ist das Ganze eine höchst dynamische Angelegenheit, bei der die Betrachtung von Entities als Typen relativ wenig Sinn ergibt - er schreibt ja ziemlich ausführlich darüber, dass man eher an relationelle Datenbanken denken sollte. So wie ich das lese, kann sich beispielsweise zur Laufzeit ändern, welche Komponenten eine Entität beinhaltet (Beispiel: Ein Techniker kommt vorbeigestiefelt und dübelt eine neue Kanone an dein Motorrad).</p>
<p>Er hat ja auch Code dazu - eine Entity (der Schlüssel) ist da ein int, eine Komponente ein Array von floats (die Daten), und das System (der eigentliche Code) befasst sich dann mit der Verarbeitung. Komponenten in eine Klasse zu gießen ergibt für mein Verständnis da noch Sinn, obwohl das Interface im Wesentlichen auf eine Methode der Form &quot;gib mir Wert X, wenn du ihn hast&quot; hinausliefe, und um den globalen Kontext zu vermeiden, wäre eine Abstraktion für die Datenbank(verbindung) bzw. dessen, was ihre Rolle übernimmt, vermutlich sinnvoll, aber die Entity selbst, so schreibt er ja ausdrücklich, sollte die Daten nicht verwalten.</p>
<p>Aber wie gesagt, das alles schreibe ich unter dem Vorbehalt, dass mein Verständnis des Feldes sich auf das Lesen dieses Artikels beschränkt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2124896</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2124896</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Wed, 28 Sep 2011 21:13:10 GMT</pubDate></item><item><title><![CDATA[Reply to Warum ist rtti so langsam? on Wed, 28 Sep 2011 22:37:24 GMT]]></title><description><![CDATA[<p>Kannst du hiermit leben?</p>
<pre><code class="language-cpp">int type_count = 0;
template&lt;class T&gt;
int get_id(){
  static int id = type_count++;
  return id;
}

class Base{
public:
  virtual int id()const=0;
};

class Derived : public Base{
public:
  virtual int id()const{ // Kann man auch per Base&lt;Derived&gt; template erzeugen lassen
    return get_id&lt;Derived&gt;();
  }
};

template&lt;class T&gt;
T*my_downcast(Base*b){
  if(b.id() == get_id&lt;T&gt;())
    return static_cast&lt;Derived*&gt;(b);
  else
    return 0;
}
</code></pre>
<p>Eventuell kann man auch irgendwie direkt die Methodenzeiger vergleichen und sich so den virtuellen Aufruf sparen, aber den Syntax kriege ich nicht aus dem Stegreif hin.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2124919</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2124919</guid><dc:creator><![CDATA[Ben04]]></dc:creator><pubDate>Wed, 28 Sep 2011 22:37:24 GMT</pubDate></item></channel></rss>