<?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[Welche Methode findet ihr besser um Klassen zu verwalten ?]]></title><description><![CDATA[<p>Bis jetzt bin ich immer so vorgegangen um mehrere Gegner im meinem Spiel zu verwalten (Ich arbeite OHNE Threads&quot;) :</p>
<pre><code>class Enemy; /*Der normale Gegner . Besitzt ausserdem eine Funktion namens 
               &quot;ManageEnemy&quot; . Diese Funktion enthählt die KI des Gegners*/

void Levels::Level1() /*Diese Funktion ist ein Teil der Hauptschleife .Ausserdem
                        Gehört sie einer Klasse an damit die Instanzen von Enemy
                        Nicht nach der Funktion zerstört werden . Nehmen wir 
                        einfach an dass 20 Instanzen existieren*/
{
/*

Dieser Teil ist uninteressant

*/
For(int j=0;j&lt;20;j++)
{
if(Enemy[j].Alive/*Ein Bool der angibt ob der Gegner lebt*/)
{
Enemy[j].ManageEnemy();
}
}
}
</code></pre>
<p>Jetzt ist mir aber letztens eine neue Methode eingefallen um die Gegner zu verwalten . Hierbei sind in der Klasse Levels keine Instanzen sondern Pointer namens &quot;PEnemy&quot; :</p>
<pre><code>int Levels::Level1()
{
/*

Dieser Teil ist uninteressant

*/
for(int j=0;j&lt;20;j++)
{
if(PEnemy[j]!=NULL)
{
if(PEnemy[j]-&gt;ManageEnemy/*Gibt diesmal nen Wert in Form eines Bools zurück der
                            angibt ob der Gegner gestorben ist*/)
{
delete PEnemy[j];
PEnemy[j] = 0;
}
}
}
}
</code></pre>
<p>Jetzt wollte ich wissen was ihr unter welchen Bedingungen besser findet .</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/332188/welche-methode-findet-ihr-besser-um-klassen-zu-verwalten</link><generator>RSS for Node</generator><lastBuildDate>Tue, 28 Apr 2026 18:48:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/332188.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 14 Apr 2015 21:20:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Welche Methode findet ihr besser um Klassen zu verwalten ? on Tue, 14 Apr 2015 21:20:54 GMT]]></title><description><![CDATA[<p>Bis jetzt bin ich immer so vorgegangen um mehrere Gegner im meinem Spiel zu verwalten (Ich arbeite OHNE Threads&quot;) :</p>
<pre><code>class Enemy; /*Der normale Gegner . Besitzt ausserdem eine Funktion namens 
               &quot;ManageEnemy&quot; . Diese Funktion enthählt die KI des Gegners*/

void Levels::Level1() /*Diese Funktion ist ein Teil der Hauptschleife .Ausserdem
                        Gehört sie einer Klasse an damit die Instanzen von Enemy
                        Nicht nach der Funktion zerstört werden . Nehmen wir 
                        einfach an dass 20 Instanzen existieren*/
{
/*

Dieser Teil ist uninteressant

*/
For(int j=0;j&lt;20;j++)
{
if(Enemy[j].Alive/*Ein Bool der angibt ob der Gegner lebt*/)
{
Enemy[j].ManageEnemy();
}
}
}
</code></pre>
<p>Jetzt ist mir aber letztens eine neue Methode eingefallen um die Gegner zu verwalten . Hierbei sind in der Klasse Levels keine Instanzen sondern Pointer namens &quot;PEnemy&quot; :</p>
<pre><code>int Levels::Level1()
{
/*

Dieser Teil ist uninteressant

*/
for(int j=0;j&lt;20;j++)
{
if(PEnemy[j]!=NULL)
{
if(PEnemy[j]-&gt;ManageEnemy/*Gibt diesmal nen Wert in Form eines Bools zurück der
                            angibt ob der Gegner gestorben ist*/)
{
delete PEnemy[j];
PEnemy[j] = 0;
}
}
}
}
</code></pre>
<p>Jetzt wollte ich wissen was ihr unter welchen Bedingungen besser findet .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450218</guid><dc:creator><![CDATA[Julian97]]></dc:creator><pubDate>Tue, 14 Apr 2015 21:20:54 GMT</pubDate></item><item><title><![CDATA[Reply to Welche Methode findet ihr besser um Klassen zu verwalten ? on Tue, 14 Apr 2015 21:28:40 GMT]]></title><description><![CDATA[<p>Ich kann mir absolut keinen Umstand ausdenken, in dem die zweite Methode irgendeinen Vorteil gegenüber der ersten haben könnte.</p>
<p>Ich könnte mir allerdings massig Methoden vorstellen, die noch besser als die erste Methode sind, aber dazu müsste man genaueres über dein Modell wissen. Da du anscheinend nichts mehr mit den toten Gegnern machst, käme so ziemlich jede Art von Datenstruktur in Frage, aus der man Elemente löschen kann, also unter anderem so ziemlich jede der Containerklassen der Standardbibliothek.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450220</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450220</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 14 Apr 2015 21:28:40 GMT</pubDate></item><item><title><![CDATA[Reply to Welche Methode findet ihr besser um Klassen zu verwalten ? on Wed, 15 Apr 2015 06:14:53 GMT]]></title><description><![CDATA[<p>Ich koennte mir das schon vorstellen, denn die Pointer liegen hintereinander im Speicher, die Alive flags hingegen nicht.</p>
<p>Wenn das Alive oft wechselt, waere es evtl. eine Idee sich zu merken bis zu welchem Index die lebenden Gegner sind und wenn einer stirbt/wiederbelebt wird einfach zwei Eintraege im vector zu tauschen.</p>
<p>Andererseits ist bei 20 Elementen solche Optimierung pure Zeitverschwendung, so langsame Rechner gibts heut ja gar nicht mehr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450247</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450247</guid><dc:creator><![CDATA[TGGC]]></dc:creator><pubDate>Wed, 15 Apr 2015 06:14:53 GMT</pubDate></item><item><title><![CDATA[Reply to Welche Methode findet ihr besser um Klassen zu verwalten ? on Wed, 15 Apr 2015 07:20:26 GMT]]></title><description><![CDATA[<p>TGGC schrieb:</p>
<blockquote>
<p>Ich koennte mir das schon vorstellen, denn die Pointer liegen hintereinander im Speicher, die Alive flags hingegen nicht.</p>
</blockquote>
<p>Ich bin mir jetzt nicht ganz sicher aber ich halte die erste Lösung für schneller.<br />
Bei der Anzahl der Gegner müssten doch auch die Alive flags optimal im Speicher liegen, ist immerhin ein Array von Enemies[] und das Alive flag ist ein member von enemies.<br />
Vielleicht passt das Enemies[] Array sogar in eine processor line aber mindestens in eine Cache Line. Ein Pointer würde da nur eine unnötige weitere Indirektion bedeuteten, weil der Content auf den der Speicher zeigt mit größerer Wahrscheinlichkeit nicht im Cache und nicht auf einer Prozessorline liegt.</p>
<p>Oder habe ich irgendwo einen Denkfehler?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450253</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450253</guid><dc:creator><![CDATA[Ruvi]]></dc:creator><pubDate>Wed, 15 Apr 2015 07:20:26 GMT</pubDate></item><item><title><![CDATA[Reply to Welche Methode findet ihr besser um Klassen zu verwalten ? on Wed, 15 Apr 2015 08:36:19 GMT]]></title><description><![CDATA[<p>Ruvi schrieb:</p>
<blockquote>
<p>TGGC schrieb:</p>
<blockquote>
<p>Ich koennte mir das schon vorstellen, denn die Pointer liegen hintereinander im Speicher, die Alive flags hingegen nicht.</p>
</blockquote>
<p>Ich bin mir jetzt nicht ganz sicher aber ich halte die erste Lösung für schneller.</p>
</blockquote>
<p>Hier wahrscheinlich ja. Aber generell kann diese Form der Datenlokalität in Extremfällen durchaus relevant werden in Hochleistungsanwendungen. Aber dann gibt es viel bessere Wege dies in C++ zu kapseln.</p>
<p>Auf den Designfehler der zweiten Methode, dass die Level-Klasse auf einmal Speicher verwalten muss (und dies auch noch äußerst schlecht implementiert) gehe ich mal nicht näher ein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450263</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450263</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 15 Apr 2015 08:36:19 GMT</pubDate></item><item><title><![CDATA[Reply to Welche Methode findet ihr besser um Klassen zu verwalten ? on Wed, 15 Apr 2015 09:40:51 GMT]]></title><description><![CDATA[<p>Ruvi schrieb:</p>
<blockquote>
<p>Vielleicht passt das Enemies[] Array sogar in eine processor line aber mindestens in eine Cache Line. Ein Pointer würde da nur eine unnötige weitere Indirektion bedeuteten, weil der Content auf den der Speicher zeigt mit größerer Wahrscheinlichkeit nicht im Cache und nicht auf einer Prozessorline liegt.</p>
</blockquote>
<p>Was ist bitte eine Prozessorline, und was meinst du wie gross eine Cache Line ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450269</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450269</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 15 Apr 2015 09:40:51 GMT</pubDate></item><item><title><![CDATA[Reply to Welche Methode findet ihr besser um Klassen zu verwalten ? on Wed, 15 Apr 2015 10:51:26 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Ruvi schrieb:</p>
<blockquote>
<p>Vielleicht passt das Enemies[] Array sogar in eine processor line aber mindestens in eine Cache Line. Ein Pointer würde da nur eine unnötige weitere Indirektion bedeuteten, weil der Content auf den der Speicher zeigt mit größerer Wahrscheinlichkeit nicht im Cache und nicht auf einer Prozessorline liegt.</p>
</blockquote>
<p>Was ist bitte eine Prozessorline, und was meinst du wie gross eine Cache Line ist?</p>
</blockquote>
<p>Also nach meinem Verständnis (vielleicht irre ich mich gut möglich) ist eine Cache Line größer als, dass was der Prozessor mit einem Happen verarbeiten kann und deswegen wird die Cache-Line mit offset gejoint und &quot;Prozessor line&quot; wär für mich persönlich die Menge an Daten die der Prozessor in einem Happen verarbeiten kann. Ich glaube das ist die Register size aber ich bin mir da jetzt nicht ganz sicher, so tief stecke ich nicht drinn.</p>
<p>Vielleicht ist das falsch oder ich habe mich falsch ausgedrückt hier mal eine korrigierte Fassung die genereller gehalten ist:</p>
<p>Vielleicht passt das Enemies[] Array sogar in eine cache line aber höchstwahrscheinlich ist es im Cache. Ein Pointer würde da nur eine unnötige weitere Indirektion bedeuteten, weil der Content auf den der Speicher zeigt nicht in einer Cache line liegt und mit größerer Wahrscheinlichkeit nicht im Cache.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450281</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450281</guid><dc:creator><![CDATA[Ruvi]]></dc:creator><pubDate>Wed, 15 Apr 2015 10:51:26 GMT</pubDate></item><item><title><![CDATA[Reply to Welche Methode findet ihr besser um Klassen zu verwalten ? on Wed, 15 Apr 2015 11:05:59 GMT]]></title><description><![CDATA[<p>Hallo! Ihr diskutiert über Optimierung, solange das Programm noch nicht mal da ist. Leute, schreibt doch erst mal das Programm, so wie es soll.</p>
<p>&quot;premature optimization is evil&quot;</p>
<p>Oder:<br />
`Rules of Optimization:</p>
<p>Rule 1: Don't do it.</p>
<p>Rule 2 (for experts only): Don't do it yet.</p>
<p>Rule 3: profile before optimizing`</p>
<p>Und zum original Poster: Fang doch erst mal an, den Code richtig zu formatieren. Ich wundere mich, dass hier so viele Leute trotzdem den Code lesen. Ich schaue mir so etwas erst gar nicht an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450288</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450288</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Wed, 15 Apr 2015 11:05:59 GMT</pubDate></item><item><title><![CDATA[Reply to Welche Methode findet ihr besser um Klassen zu verwalten ? on Wed, 15 Apr 2015 12:25:08 GMT]]></title><description><![CDATA[<p>tntnet schrieb:</p>
<blockquote>
<p>Hallo! Ihr diskutiert über Optimierung, solange das Programm noch nicht mal da ist. Leute, schreibt doch erst mal das Programm, so wie es soll.</p>
</blockquote>
<p>QFT.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/30646">@Ruvi</a>:<br />
Wir wissen weder wie gross eine &quot;Prozessorline&quot; noch ein Cacheline noch eine enemy Klasse beim OP ist und auch nicht wieviel zwischen zwei Durchlaeufen passiert was den Cache wieder leeren kann. Wieviele Objekte von den 20 alive sind, wissen wir auch nicht. Wie soll man da also ausschliessen, das eine Methode der 2 schneller ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450303</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450303</guid><dc:creator><![CDATA[TGGC]]></dc:creator><pubDate>Wed, 15 Apr 2015 12:25:08 GMT</pubDate></item><item><title><![CDATA[Reply to Welche Methode findet ihr besser um Klassen zu verwalten ? on Wed, 15 Apr 2015 12:34:53 GMT]]></title><description><![CDATA[<p>TGGC schrieb:</p>
<blockquote>
<p>QFT.<br />
<a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/30646">@Ruvi</a>:<br />
Wir wissen weder wie gross eine &quot;Prozessorline&quot; noch ein Cacheline noch eine enemy Klasse beim OP ist und auch nicht wieviel zwischen zwei Durchlaeufen passiert was den Cache wieder leeren kann. Wieviele Objekte von den 20 alive sind, wissen wir auch nicht. Wie soll man da also ausschliessen, das eine Methode der 2 schneller ist?</p>
</blockquote>
<p>Ganz klar zählt natürlich measure first aber, es gab ein Artikel und 1 Vortrag von Herb Sutter die mich was Pointer in Container/Datenstrukturen angeht ein wenig wachgerüttelt haben und die Quintessenz dessen war, dass &quot;-&gt;&quot; in modernen Prozessor Architekturen eine sehr teure Operation ist und man sie nicht ohne Not verwenden sollte.</p>
<p>Der Artikel:<br />
<a href="http://gameprogrammingpatterns.com/data-locality.html" rel="nofollow">http://gameprogrammingpatterns.com/data-locality.html</a></p>
<p>und auch diesem Vortrag von Herb Sutter:<br />
<a href="http://channel9.msdn.com/Events/Build/2014/2-661" rel="nofollow">http://channel9.msdn.com/Events/Build/2014/2-661</a><br />
Zwischen 23,30min und 41,05min.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450307</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450307</guid><dc:creator><![CDATA[Ruvi]]></dc:creator><pubDate>Wed, 15 Apr 2015 12:34:53 GMT</pubDate></item><item><title><![CDATA[Reply to Welche Methode findet ihr besser um Klassen zu verwalten ? on Wed, 15 Apr 2015 13:02:18 GMT]]></title><description><![CDATA[<p>Ruvi schrieb:</p>
<blockquote>
<p>Ganz klar zählt natürlich measure first aber, es gab ein Artikel und 1 Vortrag von Herb Sutter die mich was Pointer in Container/Datenstrukturen angeht ein wenig wachgerüttelt haben und die Quintessenz dessen war, dass &quot;-&gt;&quot; in modernen Prozessor Architekturen eine sehr teure Operation ist und man sie nicht ohne Not verwenden sollte.</p>
<p>Der Artikel:<br />
<a href="http://gameprogrammingpatterns.com/data-locality.html" rel="nofollow">http://gameprogrammingpatterns.com/data-locality.html</a></p>
<p>und auch diesem Vortrag von Herb Sutter:<br />
<a href="http://channel9.msdn.com/Events/Build/2014/2-661" rel="nofollow">http://channel9.msdn.com/Events/Build/2014/2-661</a><br />
Zwischen 23,30min und 41,05min.</p>
</blockquote>
<p>Hat der original Poster irgendwas von Performance gesagt? Ist das irgendwie von Bedeutung? Ist die Stelle, die hier angefragt wird Performancekritisch? Wir wissen es nicht. Daher sollte man das so programmieren, dass es lesbar und gut wartbar ist. Und sich auf keinen Fall irgendwelche Gedanken um Performance machen. Schon die Erwähnung von Performance führt die Leute zu leicht zu unnötig unleserlichen Code. Also lass es einfach.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450311</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450311</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Wed, 15 Apr 2015 13:02:18 GMT</pubDate></item><item><title><![CDATA[Reply to Welche Methode findet ihr besser um Klassen zu verwalten ? on Wed, 15 Apr 2015 13:19:45 GMT]]></title><description><![CDATA[<p>Sorry, ich habe lediglich TGGC Frage beantwortet aber ja wir sind zu weit vom Thema abgeschweift.</p>
<p>Back2Topic:</p>
<p>@TE:<br />
Leider hast Du den Rest deiner Architektur nicht näher erläutert aber wie SeppJ schon geschrieben hat gibt es da sicherlich Optimierungspotenzial.</p>
<p>Was den Code angeht den ich sehe würde ich wie SeppJ schon geschrieben hat einen STL::Container verwenden, du hast dort eigentlich freie Auswahl.</p>
<p>Ich würde an deiner Stelle auch RAII verwenden (und damit</p>
<pre><code>unique_ptr&lt;Enemy&gt; ptr;
</code></pre>
<p>) um deinen Speicher zu verwalten.<br />
Es ist seit dem neuen Standard äußerst untypisch native Pointer memory &quot;ownen&quot; zu lassen.<br />
Der Speicher würde in dem Moment freigegeben in dem du das Objekt aus deinem Container löschst und der Destruktor des SmartPointers aufgerufen wird.</p>
<p>Ansonsten würde ich persönlich ranged based for oder Schleifen mit Iteratoren - int basierten Schleifen vorziehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450313</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450313</guid><dc:creator><![CDATA[Ruvi]]></dc:creator><pubDate>Wed, 15 Apr 2015 13:19:45 GMT</pubDate></item></channel></rss>