<?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[Großen Speicher allocieren ? Größe des Heap&#x27;s ?]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich möchte eine Datei mit 20MB in meinen Programmspeicher einlesen.<br />
Diese Datei will ich in ein genauso großes byte (char) array laden.<br />
Nun gibt es anscheinend hier extrem viele Möglichkeiten seinen Heap zu sprengen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Nachdem ich nicht die geringste Ahnung habe, wollte ich zuerst:</p>
<pre><code>char myvariable[20480000]
</code></pre>
<p>als globale Variable setzen, weil ich dachte das global der Heap nicht benutzt wird.</p>
<p>Was soll ich sagen <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="😉"
    /> war ein Fehler ...</p>
<p>Kann mir hier jemand sagen, wie es richtig geht ?<br />
Nochwas am Rande: Ich will das nicht mit Vectoren oder ähnlich machen, weil ich Wert auf einen schnellen Speicherzugriff lege. Also will ich sozusagen unmanaged fahren.</p>
<p>Gruß<br />
TheNoName</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/207482/großen-speicher-allocieren-größe-des-heap-s</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 10:21:04 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/207482.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 08 Mar 2008 10:48:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Großen Speicher allocieren ? Größe des Heap&#x27;s ? on Sat, 08 Mar 2008 10:49:04 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich möchte eine Datei mit 20MB in meinen Programmspeicher einlesen.<br />
Diese Datei will ich in ein genauso großes byte (char) array laden.<br />
Nun gibt es anscheinend hier extrem viele Möglichkeiten seinen Heap zu sprengen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Nachdem ich nicht die geringste Ahnung habe, wollte ich zuerst:</p>
<pre><code>char myvariable[20480000]
</code></pre>
<p>als globale Variable setzen, weil ich dachte das global der Heap nicht benutzt wird.</p>
<p>Was soll ich sagen <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="😉"
    /> war ein Fehler ...</p>
<p>Kann mir hier jemand sagen, wie es richtig geht ?<br />
Nochwas am Rande: Ich will das nicht mit Vectoren oder ähnlich machen, weil ich Wert auf einen schnellen Speicherzugriff lege. Also will ich sozusagen unmanaged fahren.</p>
<p>Gruß<br />
TheNoName</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1470444</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1470444</guid><dc:creator><![CDATA[thenoname]]></dc:creator><pubDate>Sat, 08 Mar 2008 10:49:04 GMT</pubDate></item><item><title><![CDATA[Reply to Großen Speicher allocieren ? Größe des Heap&#x27;s ? on Sat, 08 Mar 2008 10:52:15 GMT]]></title><description><![CDATA[<p>std::vector ist schnell genug für dich.</p>
<p>Ansonsten</p>
<pre><code class="language-cpp">char * data = new char[20480000];
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1470446</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1470446</guid><dc:creator><![CDATA[Ponto]]></dc:creator><pubDate>Sat, 08 Mar 2008 10:52:15 GMT</pubDate></item><item><title><![CDATA[Reply to Großen Speicher allocieren ? Größe des Heap&#x27;s ? on Sat, 08 Mar 2008 11:02:30 GMT]]></title><description><![CDATA[<p>Du sprengst nicht den Heap, sondern den Stack.<br />
std::vector ist ca. so schnell, wie ein mit new angelegtes Array. Wenn du Größe im Konstruktor angibst, sollte es sogar identisch sein.</p>
<p>Gruß<br />
Don06</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1470449</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1470449</guid><dc:creator><![CDATA[Don06]]></dc:creator><pubDate>Sat, 08 Mar 2008 11:02:30 GMT</pubDate></item><item><title><![CDATA[Reply to Großen Speicher allocieren ? Größe des Heap&#x27;s ? on Sat, 08 Mar 2008 11:21:37 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ja, ich sprenge mit obiger Angabe den Stack <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /><br />
Aber mit:</p>
<pre><code>char * data = new char[20480000];
</code></pre>
<p>sprenge ich doch auch ?<br />
Der Stack und der Heap haben doch nur bestimmte Größen ?</p>
<p>Wenn ich mit 1MByte arbeite merke ich SEHR deutlich schon den Geschwindigkeitsunterschied zu vectoren !<br />
Also lasst bitte mal die vectoren aussen vor ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1470455</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1470455</guid><dc:creator><![CDATA[thenoname]]></dc:creator><pubDate>Sat, 08 Mar 2008 11:21:37 GMT</pubDate></item><item><title><![CDATA[Reply to Großen Speicher allocieren ? Größe des Heap&#x27;s ? on Sat, 08 Mar 2008 11:55:42 GMT]]></title><description><![CDATA[<p>Der Heap ist erst gesprengt, wenn du den kompletten Arbeitsspeicher beanspruchst, und das sollte nicht so schnell zu schaffen sein <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/1470468</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1470468</guid><dc:creator><![CDATA[Ryuzaki]]></dc:creator><pubDate>Sat, 08 Mar 2008 11:55:42 GMT</pubDate></item><item><title><![CDATA[Reply to Großen Speicher allocieren ? Größe des Heap&#x27;s ? on Sat, 08 Mar 2008 12:11:08 GMT]]></title><description><![CDATA[<p>Verschweigst du uns etwa, dass du einen uralt PC mit nur 8MB Arbeitsspeicher hast? <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="😉"
    /><br />
Bei mir klappt auch noch das hier (hab 2GB Arbeitsspeicher):</p>
<pre><code class="language-cpp">int main()
{
	char* one_gb_ram = new char[1024 * 1024 * 1024]; // 1073741824 Byte

	delete[] one_gb_ram;

	return 0;
}
</code></pre>
<p>Gruß<br />
Don06</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1470479</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1470479</guid><dc:creator><![CDATA[Don06]]></dc:creator><pubDate>Sat, 08 Mar 2008 12:11:08 GMT</pubDate></item><item><title><![CDATA[Reply to Großen Speicher allocieren ? Größe des Heap&#x27;s ? on Sat, 08 Mar 2008 12:27:40 GMT]]></title><description><![CDATA[<p>thenoname schrieb:</p>
<blockquote>
<p>Wenn ich mit 1MByte arbeite merke ich SEHR deutlich schon den Geschwindigkeitsunterschied zu vectoren !<br />
Also lasst bitte mal die vectoren aussen vor ...</p>
</blockquote>
<p>Hast du das Megabyte im vornherein mir vector::reserve allokiert, oder pushst du einfach immer neue Objekte rein bis das MB voll ist?</p>
<p>Bei letzterem muss der vector die Daten nämlich immer wieder um-kopieren um sich zu vergrößern, da ist das klar.<br />
Wenn du den Speicherplatz vorher reserviert hast, entfällt dieses zeitaufwändige Kopieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1470487</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1470487</guid><dc:creator><![CDATA[The-Kenny]]></dc:creator><pubDate>Sat, 08 Mar 2008 12:27:40 GMT</pubDate></item><item><title><![CDATA[Reply to Großen Speicher allocieren ? Größe des Heap&#x27;s ? on Sat, 08 Mar 2008 12:32:51 GMT]]></title><description><![CDATA[<p>The-Kenny schrieb:</p>
<blockquote>
<p>thenoname schrieb:</p>
<blockquote>
<p>Wenn ich mit 1MByte arbeite merke ich SEHR deutlich schon den Geschwindigkeitsunterschied zu vectoren !<br />
Also lasst bitte mal die vectoren aussen vor ...</p>
</blockquote>
<p>Hast du das Megabyte im vornherein mir vector::reserve allokiert, oder pushst du einfach immer neue Objekte rein bis das MB voll ist?</p>
<p>Bei letzterem muss der vector die Daten nämlich immer wieder um-kopieren um sich zu vergrößern, da ist das klar.<br />
Wenn du den Speicherplatz vorher reserviert hast, entfällt dieses zeitaufwändige Kopieren.</p>
</blockquote>
<p>nein, er mus snicht jedes mal umkopieren. nur wenn sich zusätzlicher speicher nicht direkt &quot;im anschluss&quot; reservieren läßt. aber worst case ist tatsächlich, dass er eine kopie des gesamten vectors instantiieren muss und wenn der zu kopierende vector bereits die hälfte des max speichers belegt, dann geht der schuss nach hinten los <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="😉"
    /> wie the-kenny schon richtig sagt: reserve sollte da abhilfe schafeen, wenn du weißt wie gross der speiche rungefähr werden soll</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1470490</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1470490</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Sat, 08 Mar 2008 12:32:51 GMT</pubDate></item><item><title><![CDATA[Reply to Großen Speicher allocieren ? Größe des Heap&#x27;s ? on Mon, 10 Mar 2008 13:13:10 GMT]]></title><description><![CDATA[<p>thenoname schrieb:</p>
<blockquote>
<p>Geschwindigkeitsunterschied zu vectoren !<br />
Also lasst bitte mal die vectoren aussen vor ...</p>
</blockquote>
<p>Wenn man die Arrays und die STL unter den gleichen Prämissen verwendet, ist der Geschwindigkeitsunterschied nahe bei 0.</p>
<p><strong>Thema 1: Allozierung &amp; Freigabe</strong><br />
Also was sind die Prämissen:<br />
a) Vector ist mit vorinitialisierten Elementen gefüllt<br />
b) Vector benutzt dynamische Speicherallozierung (Anlage &amp; Löschen)</p>
<p>Folgendes Programm dient nur dem Beispiel der Allozierung unter VC++ 2005 mit deaktivierter &quot;Security&quot; (er ist übervorsichtig):</p>
<pre><code class="language-cpp">#define _SECURE_SCL 0

#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;boost/progress.hpp&gt;

void wait()
{
    std::cin.clear();
    std::cin.ignore(std::cin.rdbuf()-&gt;in_avail());
    std::cin.get();
}

int main()
{
	for(int i=0; i&lt;10; ++i)
	{
		boost::progress_timer t;
		{
			long* list = new long[100000000](); // () = Basisinititalisierung s.u.
			delete[] list;
		}
	}
	for(int i=0; i&lt;10; ++i)
	{
		boost::progress_timer t;
		{
			std::vector&lt;long&gt; list(100000000);
		}
	}
	wait();
	return 0;
}
</code></pre>
<p>So... wenn man die Ergebnisse vergleicht kommt man etwa gleich weg. Wenn man aber auf eine Vorinitialisierung pfeift, macht das bei mir tatsächlich einiges aus (Nicht messbar gegenüber etwa 0,5 Sekunden).</p>
<p><strong>Thema 2: Durchiterieren auf verschiedene Art und Weise</strong><br />
So, unabhängig von der Initialisierung will ich mal alle Werte einmal setzen (mit dem index)...</p>
<p>a) Variante: Indexzugriff über for-Schleife</p>
<pre><code class="language-cpp">// Nur main, ansonsten wie oben
int main()
{
	std::vector&lt;double&gt; zeitmessungen(100);
	for(int i=0; i&lt;10; ++i)
	{
		long* list = new long[100000000]();
		{
			boost::progress_timer t;
			for(int i=0; i&lt;100000000; ++i)
				list[i] = i;
		}
		delete[] list;
	}
	for(int i=0; i&lt;10; ++i)
	{
		std::vector&lt;long&gt; list(100000000);
		{
			boost::progress_timer t;
			for(int i=0; i&lt;100000000; ++i)
				list[i] = i;
		}
	}
	wait();
	return 0;
}
</code></pre>
<p>Ich komme in beiden Fällen auf die gleichen Werte (gegen 0,31 Sekunden)</p>
<p>b) Variante: Vector durchiterieren und füllen</p>
<pre><code class="language-cpp">// Nur Ausschnitt des entsprechenden Teilabschnittes
	for(int i=0; i&lt;10; ++i)
	{
		std::vector&lt;long&gt; list(100000000);
		{
			boost::progress_timer t;
			for(std::vector&lt;long&gt;::iterator it = list.begin(), end = list.end(); it != end; ++it)
				*it = i;
		}
	}
</code></pre>
<p>Ebenso identisch...</p>
<p><strong>Mein Fazit</strong><br />
1. Bei der Allozierung kann es ein unterschied machen, sofern man uninitialisierte Arrays mit (initialisierten) Vectoren vergleicht. Ansonsten ist der Unterschied nahe 0.</p>
<p>2. Beim Zugriff nehmen sich beide Varianten nahezu 0</p>
<p>Daraus folgere ich das ein oder mehrere der folgenden Dinge bei dir zutreffen:<br />
a) Du verwendest VC und kennst den Schalter _SECURE_SCL 0 nicht<br />
b) Du hast eine wirklich miese STL-Umsetzung<br />
c) Du machst den Fehler in jedem Schleifendurchgang end() neu zu bestimmen (it&lt;list.end() ist tabu)<br />
d) Du verwendest ansonsten den Vector irgendwie falsch</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1470496</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1470496</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Mon, 10 Mar 2008 13:13:10 GMT</pubDate></item><item><title><![CDATA[Reply to Großen Speicher allocieren ? Größe des Heap&#x27;s ? on Mon, 10 Mar 2008 12:36:51 GMT]]></title><description><![CDATA[<p>Naja, wenn der heap voll ist , wird evtl. auf den Virtuellen Arbeitspeicher gekapselt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1471398</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1471398</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Mon, 10 Mar 2008 12:36:51 GMT</pubDate></item></channel></rss>