<?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[Heap, Stack und Performanzüberlegungen]]></title><description><![CDATA[<p>Servus,</p>
<p>ich weiß nicht, wie ich meine Variablen anlegen soll, damit das Programm so schnell wie möglich läuft. Mir fehlen vor allem die grundlegenden Fragen für eine Entscheidungsfindung. Ebenso weiß ich nicht, wie geschickt ein Compiler arbeitet - nicht dass dieser aus meinem Laiencode hochperformante Konstrukte bildet und meine manuellen Optimierungsversuche dann darin enden, dass diese unverändert bleiben und am Ende das Programm langsamer läuft.</p>
<p>Aktuell weiß ich, dass es 4 Speicherformen gibt:</p>
<p>Codespeicher - landet im Arbeitsspeicher, die Maschinenbefehle werden der Reihe nach in Prozessorregister geschoben und abgespeichert (jetzt wo ich das aus meinem Buch lese, sagt mir das aber nichts mehr :-), vielleicht bessert einer nach ...).</p>
<p>Datenspeicher - hier liegen alle statischen Daten bis zum Ende des Programms (ich vermute hier liegen meine globalen Variablen).</p>
<p>Stackspeicher - hier liegen die Funktionsaufrufe und die zur Funktion gehörenden lokalen Variablen (ich habe mal gelesen, oft ist hier ein Limit von 1 Megabyte).</p>
<p>Heapspeicher - das ist der Restspeicher und dort leben die mit new angelegten Objekte. Auch er bleibt verfügbar, bis er freigegeben wird oder das Programm beendet wird.</p>
<p>Ich arbeite mit Netbeans und meine Programme laufen lange, sagen wir der Algorithmus braucht 2 Stunden. Nun läuft direkt ein Profiler mit und zeigt mir den Verbrauch auf dem Heap an, der ist aber ziemlich gering (meist ein paar hundert Kilobyte), ich nutze bis jetzt kein 'new', also überrascht mich das nicht. Jetzt dachte ich, wenn ich doch diesen Heap mehr beanspruche, dann kann der Rechner vielleicht schneller sein, denn mehr als die paar Kilobyte wird der Heap ja wohl anbieten können?</p>
<p>Ich weiß auch nicht wo meine Variablen leben, ich nutze oft Vektoren, die ja C++ selbständig bei Bedarf ausweitet - was passiert da, wo leben diese Objekte?</p>
<p>Hilfreich für mich wäre eine Fragekette beim Anlegen von Variablen, bei der die Antwort dann die Entscheidung für die Art der Variable ist.</p>
<p>Danke vorab für ein paar orientierungsgebende Ratschläge!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/280314/heap-stack-und-performanzüberlegungen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 04:04:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/280314.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 13 Jan 2011 14:15:55 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Heap, Stack und Performanzüberlegungen on Thu, 13 Jan 2011 14:15:55 GMT]]></title><description><![CDATA[<p>Servus,</p>
<p>ich weiß nicht, wie ich meine Variablen anlegen soll, damit das Programm so schnell wie möglich läuft. Mir fehlen vor allem die grundlegenden Fragen für eine Entscheidungsfindung. Ebenso weiß ich nicht, wie geschickt ein Compiler arbeitet - nicht dass dieser aus meinem Laiencode hochperformante Konstrukte bildet und meine manuellen Optimierungsversuche dann darin enden, dass diese unverändert bleiben und am Ende das Programm langsamer läuft.</p>
<p>Aktuell weiß ich, dass es 4 Speicherformen gibt:</p>
<p>Codespeicher - landet im Arbeitsspeicher, die Maschinenbefehle werden der Reihe nach in Prozessorregister geschoben und abgespeichert (jetzt wo ich das aus meinem Buch lese, sagt mir das aber nichts mehr :-), vielleicht bessert einer nach ...).</p>
<p>Datenspeicher - hier liegen alle statischen Daten bis zum Ende des Programms (ich vermute hier liegen meine globalen Variablen).</p>
<p>Stackspeicher - hier liegen die Funktionsaufrufe und die zur Funktion gehörenden lokalen Variablen (ich habe mal gelesen, oft ist hier ein Limit von 1 Megabyte).</p>
<p>Heapspeicher - das ist der Restspeicher und dort leben die mit new angelegten Objekte. Auch er bleibt verfügbar, bis er freigegeben wird oder das Programm beendet wird.</p>
<p>Ich arbeite mit Netbeans und meine Programme laufen lange, sagen wir der Algorithmus braucht 2 Stunden. Nun läuft direkt ein Profiler mit und zeigt mir den Verbrauch auf dem Heap an, der ist aber ziemlich gering (meist ein paar hundert Kilobyte), ich nutze bis jetzt kein 'new', also überrascht mich das nicht. Jetzt dachte ich, wenn ich doch diesen Heap mehr beanspruche, dann kann der Rechner vielleicht schneller sein, denn mehr als die paar Kilobyte wird der Heap ja wohl anbieten können?</p>
<p>Ich weiß auch nicht wo meine Variablen leben, ich nutze oft Vektoren, die ja C++ selbständig bei Bedarf ausweitet - was passiert da, wo leben diese Objekte?</p>
<p>Hilfreich für mich wäre eine Fragekette beim Anlegen von Variablen, bei der die Antwort dann die Entscheidung für die Art der Variable ist.</p>
<p>Danke vorab für ein paar orientierungsgebende Ratschläge!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2006096</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2006096</guid><dc:creator><![CDATA[Jay1980]]></dc:creator><pubDate>Thu, 13 Jan 2011 14:15:55 GMT</pubDate></item><item><title><![CDATA[Reply to Heap, Stack und Performanzüberlegungen on Thu, 13 Jan 2011 14:25:49 GMT]]></title><description><![CDATA[<p>Alle dynamischen Containter - so auch vector - legen ihre Objekte standardmäßig auf dem Heap an. Prinzipiell gilt: Stackspeicher ist immer um ein Vielfaches schneller als der Heapspeicher, deshalb kann es bei Performancekritischen Programmen durchaus Sinn machen, einen Stackallokator zu verwenden. Deshalb kann man bei allen Standardcontainern einen zweiten Typ als Allokator festlegen, standardmäßig std::allocator&lt;T&gt;.</p>
<p>Edit: Für kleine Objekte könnte man statt new einen Small Object Allocator verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2006099</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2006099</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 13 Jan 2011 14:25:49 GMT</pubDate></item><item><title><![CDATA[Reply to Heap, Stack und Performanzüberlegungen on Thu, 13 Jan 2011 16:14:14 GMT]]></title><description><![CDATA[<p>Danke erstmal,</p>
<p>deine Antwort war für mich nicht hilfreich, ich habe schon etwas geschaut, sowohl bei Google als auch im Breymann-Buch, fand aber zu Allocators nur Material, das mir zu hoch war, daher kann ich nicht einschätzen, ob dies überhaupt auf meinen Anwendungsfall passt.</p>
<p>Kannst du mir noch ein paar Schlagworte oder einen Link mit etwas verständlicherem bzw. passendem Material geben, von welchem ich weiter ins Thema eintauchen kann?</p>
<p>Danke vorab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2006170</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2006170</guid><dc:creator><![CDATA[Jay1980]]></dc:creator><pubDate>Thu, 13 Jan 2011 16:14:14 GMT</pubDate></item><item><title><![CDATA[Reply to Heap, Stack und Performanzüberlegungen on Thu, 13 Jan 2011 16:23:26 GMT]]></title><description><![CDATA[<p>Du könntest deinen Anwendungsfall erläutern, dann könte man dir vielleicht besser helfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2006172</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2006172</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 13 Jan 2011 16:23:26 GMT</pubDate></item><item><title><![CDATA[Reply to Heap, Stack und Performanzüberlegungen on Thu, 13 Jan 2011 16:34:09 GMT]]></title><description><![CDATA[<p>Heapspeicher ist an sich nicht langsamer, lediglich die Erzeugung und Zerstörung von Objekten mittels new und delete dauert vergleichsweise lange. Beim Zugriff gibt es keinen Unterschied.</p>
<blockquote>
<p>nicht dass dieser aus meinem Laiencode hochperformante Konstrukte bildet und meine manuellen Optimierungsversuche dann darin enden, dass diese unverändert bleiben und am Ende das Programm langsamer läuft.</p>
</blockquote>
<p>Das wird oft passieren. Bei performanzkritischen Codeteilen musst du immer nachmessen, welche Optimierungen in der Praxis überhaupt etwas bringen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2006174</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2006174</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Thu, 13 Jan 2011 16:34:09 GMT</pubDate></item><item><title><![CDATA[Reply to Heap, Stack und Performanzüberlegungen on Thu, 13 Jan 2011 17:20:15 GMT]]></title><description><![CDATA[<p>Wenn Du Spaß am Lesen hast, kann ich dir dieses Blatt empfehlen:<br />
<a href="http://www.akkadia.org/drepper/cpumemory.pdf" rel="nofollow">http://www.akkadia.org/drepper/cpumemory.pdf</a></p>
<p>Außerdem noch brauchbar<br />
<a href="http://www.agner.org/optimize/optimizing_cpp.pdf" rel="nofollow">http://www.agner.org/optimize/optimizing_cpp.pdf</a></p>
<p>Letzteres würde ich dir aber nur empfehlen, wenn du gut C++ kannst um das dort geschriebene zu bewerten. Ich war beim LEsen nicht mit allem so ganz einverstanden. Einige Dinge die Compileroptimierungen betreffen sind aber mal ganz interessant.</p>
<p>Einen Algorithmus auf die Speicherverwendung zu optimieren kann eine ziemlich komplexe Sache sein. Erste Anlaufstelle für Optimierungen sind natürlich immer die Algorithmen selber, dann deren Umsetzung und dann sowas wie Cacheeffizienz.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2006196</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2006196</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Thu, 13 Jan 2011 17:20:15 GMT</pubDate></item></channel></rss>