<?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[Lokale Objekte auf Stack oder Heap?]]></title><description><![CDATA[<p>Hallo,</p>
<p>also ich habe eine Funktion, die rekursiv sich immer wieder selbst aufruft. Als Beispiel für diese Funktion, nehme ich mal folgende Funktion:</p>
<pre><code class="language-cpp">int func(int i)
{
	int data1;
	TestClass testClass;
	int data3;

	if(i &lt; 1000000000)
	{
		i++;
		func(i);
	}
	else
	{
		return i;
	}	
}
</code></pre>
<p>Meine Frage betrifft jetzt die lokale Objektvariable testClass: Wo landet die? Auf dem Stack (was ich meine) oder auf dem Heap (was jemand anderst behauptet).</p>
<p>Der Grund für meine Frage ist, dass ich beim Aufruf einer ähnlichen Funktion (die allerdings was sinnvolles macht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> ), einen Stack Overflow Fehler bekomme.<br />
Meine Lösung war dann praktisch alle Objekte durch Zeiger zu ersetzen und die Objekte via new zu erstellen und damit auf dem Heap abzulegen. Und siehe da, der Fehler war weg.<br />
Nun wurde mir aber gesagt, dass lokale Objektvariablen, im Gegensatz zu int, double etc. auf dem Heap gespeichert werden und der Compiler dann intern die Objektvariable durch einen Zeiger ersetzt. Natürlich prinzipiell keine dumme Optimierung, allerdings kann ich das nicht glauben, da es meinem obigen Problem widerspricht.<br />
Bisher glaub ich noch an meine Meinung, vor allem, da ich eben mit obiger Testversion festgestellt habe, dass testClass eine Adresse zwischen data1 und data3 besitzt (allerdings ist ein Abstand von 24 bytes (&amp;data1-&amp;data3-sizeof(data1)-sizeof(data3)) anstatt 12 bytes, die TestClass haben müsste (2x int, 1x short + alignment schätze ich).</p>
<p>Kann da jemand Licht ins dunkle bringen, in Assembler bin ich nicht so toll.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/209886/lokale-objekte-auf-stack-oder-heap</link><generator>RSS for Node</generator><lastBuildDate>Tue, 13 Oct 2026 02:21:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/209886.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 04 Apr 2008 12:47:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Lokale Objekte auf Stack oder Heap? on Fri, 04 Apr 2008 12:47:41 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>also ich habe eine Funktion, die rekursiv sich immer wieder selbst aufruft. Als Beispiel für diese Funktion, nehme ich mal folgende Funktion:</p>
<pre><code class="language-cpp">int func(int i)
{
	int data1;
	TestClass testClass;
	int data3;

	if(i &lt; 1000000000)
	{
		i++;
		func(i);
	}
	else
	{
		return i;
	}	
}
</code></pre>
<p>Meine Frage betrifft jetzt die lokale Objektvariable testClass: Wo landet die? Auf dem Stack (was ich meine) oder auf dem Heap (was jemand anderst behauptet).</p>
<p>Der Grund für meine Frage ist, dass ich beim Aufruf einer ähnlichen Funktion (die allerdings was sinnvolles macht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> ), einen Stack Overflow Fehler bekomme.<br />
Meine Lösung war dann praktisch alle Objekte durch Zeiger zu ersetzen und die Objekte via new zu erstellen und damit auf dem Heap abzulegen. Und siehe da, der Fehler war weg.<br />
Nun wurde mir aber gesagt, dass lokale Objektvariablen, im Gegensatz zu int, double etc. auf dem Heap gespeichert werden und der Compiler dann intern die Objektvariable durch einen Zeiger ersetzt. Natürlich prinzipiell keine dumme Optimierung, allerdings kann ich das nicht glauben, da es meinem obigen Problem widerspricht.<br />
Bisher glaub ich noch an meine Meinung, vor allem, da ich eben mit obiger Testversion festgestellt habe, dass testClass eine Adresse zwischen data1 und data3 besitzt (allerdings ist ein Abstand von 24 bytes (&amp;data1-&amp;data3-sizeof(data1)-sizeof(data3)) anstatt 12 bytes, die TestClass haben müsste (2x int, 1x short + alignment schätze ich).</p>
<p>Kann da jemand Licht ins dunkle bringen, in Assembler bin ich nicht so toll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1486436</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1486436</guid><dc:creator><![CDATA[XCooperation]]></dc:creator><pubDate>Fri, 04 Apr 2008 12:47:41 GMT</pubDate></item><item><title><![CDATA[Reply to Lokale Objekte auf Stack oder Heap? on Fri, 04 Apr 2008 13:05:57 GMT]]></title><description><![CDATA[<p>Benutzerdefiniertetypen verhalten sich (fast) so wie die Built-ins, sprich die kommen nur auf den &quot;Free Store&quot;, wenn man sie mit new alloziert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1486449</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1486449</guid><dc:creator><![CDATA[Don06]]></dc:creator><pubDate>Fri, 04 Apr 2008 13:05:57 GMT</pubDate></item><item><title><![CDATA[Reply to Lokale Objekte auf Stack oder Heap? on Fri, 04 Apr 2008 13:18:00 GMT]]></title><description><![CDATA[<p>Zusammengefasst: Stimmt. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1486463</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1486463</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Fri, 04 Apr 2008 13:18:00 GMT</pubDate></item><item><title><![CDATA[Reply to Lokale Objekte auf Stack oder Heap? on Fri, 04 Apr 2008 13:47:05 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>In C++ spricht man nicht von Stack und Heap sondern von statischer und dynamischer Speicherzuweisung. Aber gut, jeder weiß was gemeint ist. <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>Ohne den new()-Operator (bzw. auch ohne malloc(), free(), ...) gibt es keine dynamische Speicherzuweisung. Der Speicher für dein Objekt <strong>testClass</strong> wird statisch, d.h. zur Compilezeit festgelegt.</p>
<p>Du kannst aber nicht verhindern, dass das Objekt selbst dynamische Speicherzuweisungen enthält, die dann z.B. bei der Initialisierung oder auch später zum Tragen kommen.</p>
<p>Übrigens Stack-Overflow-Fehler kann man auch durch die Vergrößerung des Stacks umgehen.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1486485</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1486485</guid><dc:creator><![CDATA[vic1986]]></dc:creator><pubDate>Fri, 04 Apr 2008 13:47:05 GMT</pubDate></item><item><title><![CDATA[Reply to Lokale Objekte auf Stack oder Heap? on Fri, 04 Apr 2008 15:00:30 GMT]]></title><description><![CDATA[<p>XCooperation schrieb:</p>
<blockquote>
<p>Nun wurde mir aber gesagt, dass lokale Objektvariablen, im Gegensatz zu int, double etc. auf dem Heap gespeichert werden und der Compiler dann intern die Objektvariable durch einen Zeiger ersetzt.</p>
</blockquote>
<p>Das ist in Java und anderen Sprachen so, aber nicht in C++. Objekte haben prinzipiell keine Sonderrolle, der Übergang von primitiven Typen zu Objekten ist in C++ fließend.</p>
<blockquote>
<p>Natürlich prinzipiell keine dumme Optimierung</p>
</blockquote>
<p>Optimierung? Heap-Allokation ist zigmal langsamer als Stack-Allokation <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="🙂"
    /> Ohne effizienten Garbage-Collector jedenfalls.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1486549</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1486549</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Fri, 04 Apr 2008 15:00:30 GMT</pubDate></item><item><title><![CDATA[Reply to Lokale Objekte auf Stack oder Heap? on Fri, 04 Apr 2008 15:16:34 GMT]]></title><description><![CDATA[<p>Bashar schrieb:</p>
<blockquote>
<p>Optimierung? Heap-Allokation ist zigmal langsamer als Stack-Allokation <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="🙂"
    /> Ohne effizienten Garbage-Collector jedenfalls.</p>
</blockquote>
<p>Technische OT Frage: Warum ist das so?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1486563</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1486563</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Fri, 04 Apr 2008 15:16:34 GMT</pubDate></item><item><title><![CDATA[Reply to Lokale Objekte auf Stack oder Heap? on Fri, 04 Apr 2008 15:18:27 GMT]]></title><description><![CDATA[<p>Platz auf dem Stack anfordern = Stackpointer verschieben, fertig<br />
Platz auf dem Heap anfordern = Parameter auf den Stack (das geht schon länger), Trap, warten bis das Betriebsystem einem den Gefallen gemacht hat, fertig</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1486564</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1486564</guid><dc:creator><![CDATA[drakon is doof]]></dc:creator><pubDate>Fri, 04 Apr 2008 15:18:27 GMT</pubDate></item><item><title><![CDATA[Reply to Lokale Objekte auf Stack oder Heap? on Fri, 04 Apr 2008 15:53:39 GMT]]></title><description><![CDATA[<p>drakon is doof schrieb:</p>
<blockquote>
<p>Platz auf dem Heap anfordern = Parameter auf den Stack (das geht schon länger), Trap, warten bis das Betriebsystem einem den Gefallen gemacht hat, fertig</p>
</blockquote>
<p>So ein Quatsch. Das Betriebssystem wird gefragt, wenn der Heap vergrößert werden muss, nicht bei jeder kleinen Allokation.</p>
<p>Eine Heap-Allokation dauert länger, weil dazu erstmal ein freier, ausreichend großer Block gesucht werden muss. Falls er deutlich zu groß ist, muss er auch erstmal zurechtgeschnitten werden, d.h. in einen belegten und einen freien Block unterteilt werden. Bei der Freigabe muss der Block wieder der Verwaltung der freien Blöcke hinzugefügt und eventuell mit benachbarten freien Blöcken verschmolzen werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1486584</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1486584</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Fri, 04 Apr 2008 15:53:39 GMT</pubDate></item><item><title><![CDATA[Reply to Lokale Objekte auf Stack oder Heap? on Fri, 04 Apr 2008 16:22:49 GMT]]></title><description><![CDATA[<p>Ok, danke für eure Antworten. Also liegt die Variable tatsächlich auf dem Stack.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/904">@Bashar</a>: Mich hat das ganze ebenfalls sehr an Java erinnert, deswegen war ich da auch so skeptisch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1486607</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1486607</guid><dc:creator><![CDATA[XCooperation]]></dc:creator><pubDate>Fri, 04 Apr 2008 16:22:49 GMT</pubDate></item></channel></rss>