<?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[Speicherverbrauch std::map &amp;amp; Membervariablen]]></title><description><![CDATA[<p>Hi<br />
Bitte den Sinn mal außer Acht lassen; ist nur als Beispiel zu verstehen.</p>
<p>class.h</p>
<pre><code class="language-cpp">deque&lt;int&gt; _deq;
    map&lt;deque&lt;int&gt;,int&gt; _map;
</code></pre>
<p>class.cpp</p>
<pre><code class="language-cpp">void func(int a, int b, int c) {
    _deq.clear();
    _deq.push_back(a);
    _deq.push_back(b);
    _deq.push_back(a);
    _deq.push_back(c);
    map&lt;deque&lt;int&gt;,int&gt;::iterator it;
    it = _map.find(_deq);
    if (it == _map.end()) {
        _map.insert(make_pair(_deq, 1));
    } else {
        it-&gt;second +=1;
    }
}

void dest() {
    map&lt;deque&lt;int&gt;,int&gt;::iterator it = _map.begin();
    for (; it != _map.end(); it++) {
        if (it-&gt;second &lt; 10)
            _map.erase(it);
    }
}
</code></pre>
<p>Durch die Funktion func() wird in der Membervariablen _map eine Struktur aufgebaut in der gezählt wird, wie oft eine deque von ints vorkommt. Wenn sie noch nicht vorhanden ist, wiest sie eingefügt, ansonsten wird der zähler erhöht.</p>
<p>Irgendwann ist die _map gefüllt und die Funktion dest() soll alle Elemente von _map löschen, die weniger als 10 Mal vorkommen.</p>
<p>Meine Frage:<br />
Wird der Speicherplatz, den die Elemente verbraucht haben, sofort nach dem erase wieder freigegeben oder bleibt er solange belegt, bis der Destruktor von &quot;class&quot; ausgerufen wird (weil dann ja erst deren Membervariable _map gelöscht wird) ?</p>
<p>Meinungen ?<br />
Dankeschön !</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/146816/speicherverbrauch-std-map-amp-membervariablen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 04 Sep 2026 03:46:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/146816.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 11 May 2006 09:00:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Speicherverbrauch std::map &amp;amp; Membervariablen on Thu, 11 May 2006 09:41:13 GMT]]></title><description><![CDATA[<p>Hi<br />
Bitte den Sinn mal außer Acht lassen; ist nur als Beispiel zu verstehen.</p>
<p>class.h</p>
<pre><code class="language-cpp">deque&lt;int&gt; _deq;
    map&lt;deque&lt;int&gt;,int&gt; _map;
</code></pre>
<p>class.cpp</p>
<pre><code class="language-cpp">void func(int a, int b, int c) {
    _deq.clear();
    _deq.push_back(a);
    _deq.push_back(b);
    _deq.push_back(a);
    _deq.push_back(c);
    map&lt;deque&lt;int&gt;,int&gt;::iterator it;
    it = _map.find(_deq);
    if (it == _map.end()) {
        _map.insert(make_pair(_deq, 1));
    } else {
        it-&gt;second +=1;
    }
}

void dest() {
    map&lt;deque&lt;int&gt;,int&gt;::iterator it = _map.begin();
    for (; it != _map.end(); it++) {
        if (it-&gt;second &lt; 10)
            _map.erase(it);
    }
}
</code></pre>
<p>Durch die Funktion func() wird in der Membervariablen _map eine Struktur aufgebaut in der gezählt wird, wie oft eine deque von ints vorkommt. Wenn sie noch nicht vorhanden ist, wiest sie eingefügt, ansonsten wird der zähler erhöht.</p>
<p>Irgendwann ist die _map gefüllt und die Funktion dest() soll alle Elemente von _map löschen, die weniger als 10 Mal vorkommen.</p>
<p>Meine Frage:<br />
Wird der Speicherplatz, den die Elemente verbraucht haben, sofort nach dem erase wieder freigegeben oder bleibt er solange belegt, bis der Destruktor von &quot;class&quot; ausgerufen wird (weil dann ja erst deren Membervariable _map gelöscht wird) ?</p>
<p>Meinungen ?<br />
Dankeschön !</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1055369</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1055369</guid><dc:creator><![CDATA[Benja_m]]></dc:creator><pubDate>Thu, 11 May 2006 09:41:13 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverbrauch std::map &amp;amp; Membervariablen on Thu, 11 May 2006 09:21:12 GMT]]></title><description><![CDATA[<p>Afaik wird der Speicherplatz sofort an den Allocator der map zurückgegeben, wenn du erase() aufrufst. Allerdings kann es sein, daß dieser ihn erstmal zwischenlagert (und beim nächsten insert() die vorreservierten Speicherblöcke verwendet).</p>
<p>Btw, dein Code dürfte zur Laufzeit abschmieren - erase() macht den Iterator ungültig, den du zum Löschen freigegeben hast, das heißt, anschließend darfst du ihn nicht mehr verwenden (und auch nicht inkrementieren). Sicherer ist es so:</p>
<pre><code class="language-cpp">for (; it != _map.end();)
{
  if (it-&gt;second &lt; 10)
    _map.erase(it++);
  else
    ++it;
}
</code></pre>
<p>Und auch beim Einfügen läuft etwas nicht rund - end() darf nicht dereferenziert werden (und selbst wenn, dürfte it-&gt;first nicht den richtigen Schlüsselwert haben). Davon daß man in einer map&lt;int,int&gt; nur nach int-Werten suchen kann und nicht nach deque&lt;int&gt;'s, will ich gar nicht mal reden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1055396</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1055396</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 11 May 2006 09:21:12 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverbrauch std::map &amp;amp; Membervariablen on Thu, 11 May 2006 09:40:32 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Afaik wird der Speicherplatz sofort an den Allocator der map zurückgegeben, wenn du erase() aufrufst. Allerdings kann es sein, daß dieser ihn erstmal zwischenlagert (und beim nächsten insert() die vorreservierten Speicherblöcke verwendet).</p>
</blockquote>
<p>Okay, das würde erklären, wieso der Prozess nach dem Aufruf von dest() noch genausoviel Speicher alloquiert hat (laut linux &quot;top&quot;) wie vorher. Natürlich sieht man das nur, wenn die Datenstrukturen entsprechen groß sind - und das sind sie bei mir. Schade. Denn mein Programm braucht ziemlich viel Speicher und ich hoffte, durch die Löschung von &quot;unnötigem Ballast&quot; mehr freien Speicher zu erhalten.</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>Btw, dein Code dürfte zur Laufzeit abschmieren - erase() macht den Iterator ungültig, den du zum Löschen freigegeben hast, das heißt, anschließend darfst du ihn nicht mehr verwenden (und auch nicht inkrementieren).</p>
</blockquote>
<p>Genau so habe ich meine STL-Referenz auch verstanden. Witzigerweise funktioniert es trotzdem. Aber ich werds nochmal ändern. War mir auch zu unsicher so.</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>Und auch beim Einfügen läuft etwas nicht rund - end() darf nicht dereferenziert werden (und selbst wenn, dürfte it-&gt;first nicht den richtigen Schlüsselwert haben).</p>
</blockquote>
<p>Du hast recht, auch da war ein Fehler im &quot;Vereinfachen&quot; unterlaufen. Wird korrigiert...</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>Davon daß man in einer map&lt;int,int&gt; nur nach int-Werten suchen kann und nicht nach deque&lt;int&gt;'s, will ich gar nicht mal reden.</p>
</blockquote>
<p>Das war natürlcih n Denkfehler, in meinem Programm isses richtig und oben hab ichs korrigiert.</p>
<p>Danke !</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1055413</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1055413</guid><dc:creator><![CDATA[Benja_m]]></dc:creator><pubDate>Thu, 11 May 2006 09:40:32 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverbrauch std::map &amp;amp; Membervariablen on Thu, 11 May 2006 09:41:59 GMT]]></title><description><![CDATA[<p>so, ich habs jetzt (hoffentlich) ganz oben so korrigiert, wie es eigentlich sein müsste. den beitrag hierdrüber hab ich auch editiert weswegen ich darauf an dieser stelle nochmal hinweise ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1055418</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1055418</guid><dc:creator><![CDATA[Benja_m]]></dc:creator><pubDate>Thu, 11 May 2006 09:41:59 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverbrauch std::map &amp;amp; Membervariablen on Thu, 11 May 2006 09:48:21 GMT]]></title><description><![CDATA[<p>Benja_m schrieb:</p>
<blockquote>
<p>CStoll schrieb:</p>
<blockquote>
<p>Afaik wird der Speicherplatz sofort an den Allocator der map zurückgegeben, wenn du erase() aufrufst. Allerdings kann es sein, daß dieser ihn erstmal zwischenlagert (und beim nächsten insert() die vorreservierten Speicherblöcke verwendet).</p>
</blockquote>
<p>Okay, das würde erklären, wieso der Prozess nach dem Aufruf von dest() noch genausoviel Speicher alloquiert hat (laut linux &quot;top&quot;) wie vorher. Natürlich sieht man das nur, wenn die Datenstrukturen entsprechen groß sind - und das sind sie bei mir. Schade. Denn mein Programm braucht ziemlich viel Speicher und ich hoffte, durch die Löschung von &quot;unnötigem Ballast&quot; mehr freien Speicher zu erhalten.</p>
</blockquote>
<p>Da solltest du dich mal nach systemspezifischen Funktionen umsehen, mit denen du den unbenutzten Speicher komplett wieder entsorgen kannst - dafür gibt es bestimmt nichts im ANSI-Standard.</p>
<blockquote>
<p>CStoll schrieb:</p>
<blockquote>
<p>Btw, dein Code dürfte zur Laufzeit abschmieren - erase() macht den Iterator ungültig, den du zum Löschen freigegeben hast, das heißt, anschließend darfst du ihn nicht mehr verwenden (und auch nicht inkrementieren).</p>
</blockquote>
<p>Genau so habe ich meine STL-Referenz auch verstanden. Witzigerweise funktioniert es trotzdem. Aber ich werds nochmal ändern. War mir auch zu unsicher so.</p>
</blockquote>
<p>Das nennt sich dann Glück (undefiniertes Verhalten bedeutet, daß sich der Compiler aussuchen darf, wie er reagiert - offenbar hat deiner das gelöschte Element nur als ungültig markiert und die Pointer von den Nachbarn passend umgebogen).</p>
<p>PS: Das Einfügen und mitzählen kannst du dir übrigens etwas vereinfachen:</p>
<pre><code class="language-cpp">_map[_deq]++;
</code></pre>
<p>(anstelle der kompletten find() und if()-Konstruktion)</p>
<p>PPS: Wenn du _deq in der Funktion soweiso jedes Mal löschst und neu auffüllst, wäre wohl eine lokale Variable günstiger.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1055422</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1055422</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 11 May 2006 09:48:21 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverbrauch std::map &amp;amp; Membervariablen on Thu, 11 May 2006 10:33:56 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>PS: Das Einfügen und mitzählen kannst du dir übrigens etwas vereinfachen:</p>
<pre><code class="language-cpp">_map[_deq]++;
</code></pre>
<p>(anstelle der kompletten find() und if()-Konstruktion)</p>
</blockquote>
<p>&quot;Der Indexoperatir [] gibt eine Referenz auf den mit dem Schlüssel assoziierten Wert zurück.&quot; -&gt; Wenn der Schlüssel da ist, wird bei &quot;map[schlüssel]++&quot; also das gemacht, was sonst it-&gt;second +=1 macht ?</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>PPS: Wenn du _deq in der Funktion soweiso jedes Mal löschst und neu auffüllst, wäre wohl eine lokale Variable günstiger.</p>
</blockquote>
<p>[/quote]<br />
Auch wahr, wenn die Variable nicht auch anderswo gelesen werden würde <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/1055457</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1055457</guid><dc:creator><![CDATA[Benja_m]]></dc:creator><pubDate>Thu, 11 May 2006 10:33:56 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverbrauch std::map &amp;amp; Membervariablen on Thu, 11 May 2006 10:50:31 GMT]]></title><description><![CDATA[<p>Benja_m schrieb:</p>
<blockquote>
<p>&quot;Der Indexoperatir [] gibt eine Referenz auf den mit dem Schlüssel assoziierten Wert zurück.&quot; -&gt; Wenn der Schlüssel da ist, wird bei &quot;map[schlüssel]++&quot; also das gemacht, was sonst it-&gt;second +=1 macht ?</p>
</blockquote>
<p>Ja, aber was noch wichtiger ist: Wenn der Schlüssel noch nicht exisitert, wird er angelegt (mit 0 als Wert) - und anschließend inkrementiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1055475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1055475</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 11 May 2006 10:50:31 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverbrauch std::map &amp;amp; Membervariablen on Thu, 11 May 2006 11:22:29 GMT]]></title><description><![CDATA[<p>wie geil is das denn ? <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>danke <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>
<p>allerdings behebt das mein problem mit dem speicherverbrauch noch nicht.<br />
da muss ich aber nochmal genau schauen was das nun ist und wie ich das beheben kann...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1055518</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1055518</guid><dc:creator><![CDATA[Benja_m]]></dc:creator><pubDate>Thu, 11 May 2006 11:22:29 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverbrauch std::map &amp;amp; Membervariablen on Thu, 11 May 2006 12:04:19 GMT]]></title><description><![CDATA[<blockquote>
<p>da muss ich aber nochmal genau schauen was das nun ist und wie ich das beheben kann...</p>
</blockquote>
<p>dann wirst du dich sicher ueber die Impl deiner STL freuen ^^</p>
<p>Die STL benutzt fuer ihre container eigene allokatoren, der holt also speicher fuer die objecte die in ne map vector ... reinwirst nicht mit nem blanken new, sondern allokiert grosszugieger speicher und konstruiert deine objecte auf den vorher allokierten speicher ....</p>
<p>d.h.u.a.</p>
<p>- wenn du nen element aus ner map/set loeschst, wird das object ungueltig, der speicher nur theoretisch frei, das BS bekommt davon nicht unbedingt was mit, weil der allokator noch drueberliegt. erst wenn der den speicher wieder freigibt, was er sicherlich nich jedesmal machen wird, wuerde das BS was davon mitbekommen.</p>
<p>- wenn du in ner map 1 element einfuegst, muss der allokator nicht zwangslaeufig genau 1*sizeof(Element) anfordern, sondern eher etwas mehr, dafuer das bei jedem insert ned unbedingt tun ...</p>
<p>Das tut er um die unendlich vielen news und deletes zu minimieren.</p>
<p>der allokator laesst sich aber ueberschreiben, der iss per template param auf ne default impl festgelegt.</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1055565</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1055565</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Thu, 11 May 2006 12:04:19 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverbrauch std::map &amp;amp; Membervariablen on Thu, 11 May 2006 12:15:03 GMT]]></title><description><![CDATA[<p>ich meinte eher, welche meiner zahlreichen datenstrukturen denn am meisten elemente hat.<br />
daraus kann ich dann (hoffentlich) ableiten, wo der ganze speicher verbraten wird <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>muss ich mir mal paar debug-ausgaben ins prog basteln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1055574</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1055574</guid><dc:creator><![CDATA[Benja_m]]></dc:creator><pubDate>Thu, 11 May 2006 12:15:03 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverbrauch std::map &amp;amp; Membervariablen on Thu, 11 May 2006 13:37:21 GMT]]></title><description><![CDATA[<p>Okay, ich kann jetzt folgendes feststellen bei mir:</p>
<pre><code class="language-cpp">map&lt;deque&lt;int&gt;, int&gt; _map;
</code></pre>
<p>Diese Map enthält NUR deques mit 2 bis 10 Einträgen. Größere gibt es nicht. Und der zweite Int-Wert ist der Zähler, wie oft die deque schon vorkam.</p>
<p>Wenn ich das hinzufügen zu dieser map auskommentiere, dann ist mein Speicherverbrauch des Gesamtprogramms bei knapp 2 MB.</p>
<p>Diese Map belegt bei 221592 Einträgen (sie enthält also 221592 deques und 221592 ints) allerdings stattliche 130 MB RAM.<br />
Mit 403483 Einträgen belegt sie 235 MB RAM.*</p>
<p>Ich stelle mich mal dumm:</p>
<pre><code>221592 Einträge * 10 int (MaxLen deque) * 4 (sizeof(int)) = 8863680 Byte ~ 8,5 MB
221592 Einträge * 4 (sizeof(int)) = 886368 Byte ~ 0,8 MB

403483 Einträge * 10 int * 4 = 16139320 ~ 15,4 MB
403483 Einträge * 4 = 1613932 ~ 1,5 MB
</code></pre>
<p>Zuzüglich Verwaltung. Die deque muss ja wissen, wie groß sie ist usw...<br />
Meinetwegen Faktor 2 (was bestimmt schon zu hoch angesetzt ist).</p>
<p>Dann käme für Fall 1 ein Overhead von ~111 MB (=130 - 2*8,5 -2*0,8) dabei raus. Für Fall 2 ein Overhead von 202 MB (=235 - 2*15,4 - 2*1,1).</p>
<p><strong>Das trau ich der STL und C++ nicht zu <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="😉"
    /></strong><br />
Also muss ich einen Denkfehler haben.</p>
<p>Wo ? Ich finde ihn nicht <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>* Dieser Wert wird mir von &quot;top&quot; unter Linux angezeigt als Wert für den beanspruchten virtuellen Adressraum.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1055651</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1055651</guid><dc:creator><![CDATA[Benja_m]]></dc:creator><pubDate>Thu, 11 May 2006 13:37:21 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverbrauch std::map &amp;amp; Membervariablen on Thu, 11 May 2006 14:08:50 GMT]]></title><description><![CDATA[<p>Ein paar Bytes mehr mußt du schon einrechnen:</p>
<p>- jede Map benötigt für jeden Eintrag mind. 2 Zeiger (left + right)<br />
- der Standard-Container für deque ist vector, d.h. ein vector hat eine Kapazität, die immer größer/gleich der aktuellen Größe ist, d.h. bei 2-10 Werten werden z.B. 16 oder mehr reserviert (ruf mal die Methode capacity() vom vector (bzw. deque) auf)</p>
<p>Wenn die Zeiger bei dir 4 (evtl. sogar 8 bei 64Bit-System?) groß sind,<br />
so sind mindestens<br />
4 (left)<br />
4 (right)<br />
deque:<br />
4 (front)<br />
4 (back)<br />
vector:<br />
16 * 4 + 4 (size)<br />
int:<br />
4<br />
--------<br />
88 Bytes</p>
<p>88 * 221592 = 19,5 MB</p>
<p>zu veranschlagen...</p>
<p>Bei Kapazität von 32 (statt 16) und 8 Byte pro Zeiger kommt man dann schon auf<br />
304 Bytes pro Eintrag, d.h. 304 * 221592 = 67 MB</p>
<p>Aber auf 130 MB komme ich auch nicht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1055676</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1055676</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Thu, 11 May 2006 14:08:50 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverbrauch std::map &amp;amp; Membervariablen on Thu, 11 May 2006 14:22:44 GMT]]></title><description><![CDATA[<p>deque hat kein capacity(). deren größe (bzw reservierter speicherplatz) würde mich allerdings schon interessieren...</p>
<p>sizeof(int) ist bei mir 4. 32Bit System -&gt; Zeiger sind auch 4Byte</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1055696</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1055696</guid><dc:creator><![CDATA[Benja_m]]></dc:creator><pubDate>Thu, 11 May 2006 14:22:44 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverbrauch std::map &amp;amp; Membervariablen on Fri, 12 May 2006 06:17:24 GMT]]></title><description><![CDATA[<p>Th schrieb:</p>
<blockquote>
<p>- der Standard-Container für deque ist vector, d.h. ein vector hat eine Kapazität, die immer größer/gleich der aktuellen Größe ist, d.h. bei 2-10 Werten werden z.B. 16 oder mehr reserviert (ruf mal die Methode capacity() vom vector (bzw. deque) auf)</p>
</blockquote>
<p>Das ist (sorry) Käse - deque hat eine ganz eigene Implementation, die völlig unabhängig von vector sein dürfte. Allerdings kannst du trotzdem davon ausgehen, daß sie sich den Speicher in größeren Blöcken besorgt (wie groß, kannst du nicht beeinflussen - aber du solltest dich mal durch den Header &lt;deque&gt; durcharbeiten, da solltest du auch die genaue Arbeitsweise der Klasse verstehen ;)).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1056091</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1056091</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 12 May 2006 06:17:24 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverbrauch std::map &amp;amp; Membervariablen on Fri, 12 May 2006 06:48:26 GMT]]></title><description><![CDATA[<p>Hast du denn eine Idee, wo der Speicher verbraucht wird ?<br />
Ich bin da ratlos <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1056103</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1056103</guid><dc:creator><![CDATA[Benja_m]]></dc:creator><pubDate>Fri, 12 May 2006 06:48:26 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverbrauch std::map &amp;amp; Membervariablen on Fri, 12 May 2006 07:35:33 GMT]]></title><description><![CDATA[<p>Wie gesagt, schau dir mal den Header &lt;deque&gt; an - irgenwo dort drinn dürfte stehen, wie groß die Speicherblöcke sind, die eine Deque jeweils am Stück anfordert.</p>
<p>Btw, wenn du weißt, wie groß deine Felder (maximal) werden, könntest du auch eine Array-Klasse mit konstanter Größe verwenden:</p>
<pre><code class="language-cpp">template&lt;typename T,size_t N&gt;
class Array
{
private:
  T data[N];
public:
  T&amp; operator[](size_t i) {return data[i];}
  ...
};
</code></pre>
<p>(entweder selber schreiben oder etwas warten - im dritten Teil meiner STL-Serie kommt so eine Klasse vor)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1056138</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1056138</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 12 May 2006 07:35:33 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverbrauch std::map &amp;amp; Membervariablen on Fri, 12 May 2006 07:55:43 GMT]]></title><description><![CDATA[<p>Mal ne ganz andere (naive) Frage, wie misst du denn den Speicherverbrauch deines Progs ?</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1056148</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1056148</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Fri, 12 May 2006 07:55:43 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverbrauch std::map &amp;amp; Membervariablen on Fri, 12 May 2006 08:21:27 GMT]]></title><description><![CDATA[<p>RHBaum schrieb:</p>
<blockquote>
<p>Mal ne ganz andere (naive) Frage, wie misst du denn den Speicherverbrauch deines Progs ?</p>
</blockquote>
<p>Ich arbeite unter Linux. Da gibts auf der Konsole <a href="http://de.wikipedia.org/wiki/Bash" rel="nofollow">bash</a> ein Tool names <a href="http://unixhelp.ed.ac.uk/CGI/man-cgi?top+1" rel="nofollow">top</a>.<br />
Das zeigt dir diverse Daten zu laufenden Prozessen an. Unter anderem auch, wieviel Speicher reserviert ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1056180</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1056180</guid><dc:creator><![CDATA[Benja_m]]></dc:creator><pubDate>Fri, 12 May 2006 08:21:27 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverbrauch std::map &amp;amp; Membervariablen on Fri, 12 May 2006 08:37:39 GMT]]></title><description><![CDATA[<p>Bin in Linux nich ganz so fit ... deswegen solltest dich da mal naeher erkundigen wie die speicherverwaltung da funzt ...</p>
<p>top zeigt dir gleub ich den gesamtspeicherverbrauch deines prozesses an ...<br />
zum cashen und optimieren von prozessen zieht dein BS aber immer mehr speicher noch hinzu ... die festpladde generell wird ja auch gecacht, iss nur die Frage ob das dann im Prozessraum deines Progs laeuft ....</p>
<p>zum testen wuerd ich mal die container zwar anlegen, aber beim befuellen statt dem anhaengen das erste lelement immer ueberschreiben, so dass die container nie gross werden, und dann mal den speicherverbrauch messen um nen vergleichswert zu haben ...</p>
<p>Bessere und genauere infos bekommst aber mit speziellen tools zur optimierung / kontrolle des speichers ... valgrind z.b. vielleicht solltest das mal ausprobieren ...</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1056196</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1056196</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Fri, 12 May 2006 08:37:39 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverbrauch std::map &amp;amp; Membervariablen on Fri, 12 May 2006 08:56:36 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10318">@CStoll</a>: Stimmt, hatte mich mit 'queue' vertan ...</p>
<p>Aber die Frage ist sowieso, ob hierfür eine deque benutzt werden sollte (da diese nur zusätzliche Vorteile beim Anfügen an die erste Position bringt - gegenüber einem vector).</p>
<p>Und stimme dir zu: wenn die Größe von vornherein feststeht, dann einfach ein konstantes Array aufbauen (ist schneller, da nicht immer wieder reallokiert werden muß).</p>
<p>Habe mal bei der MSVC Implementation nachgeschaut:<br />
die deque verwendet intern auch wieder eine map...</p>
<p>P.S: Ich habe auch eine eigene Array-Klasse mit maximaler Größe (bzw. 2, da eine die max. Größe als Template-Parameter nimmt, die andere als Parameter im Konstruktor).<br />
Bei Bedarf verschicke ich sie gerne...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1056220</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1056220</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Fri, 12 May 2006 08:56:36 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverbrauch std::map &amp;amp; Membervariablen on Fri, 12 May 2006 08:57:36 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Wie gesagt, schau dir mal den Header &lt;deque&gt; an - irgenwo dort drinn dürfte stehen, wie groß die Speicherblöcke sind, die eine Deque jeweils am Stück anfordert.</p>
</blockquote>
<p>Also, da muss ich mich dann wieder als doof outen. Ich nutze eclipse mit CDT. Wenn ich da auf die Definition einer deque klicke mit Strg gedrückt, dann leitet der mich weiter a eine Datei /usr/include/g++/bitsstl_deque.h<br />
In dieser Datei habe ich keine explizite Angabe gefunden, wieviel Speicher denn nun reserviert wird. Aber das ganze ist mir auch irgendwie eine Nummer zu heavy zum Durchsteigen. Sieht schon ziemlich krass aus <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/1056229</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1056229</guid><dc:creator><![CDATA[Benja_m]]></dc:creator><pubDate>Fri, 12 May 2006 08:57:36 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverbrauch std::map &amp;amp; Membervariablen on Fri, 12 May 2006 09:17:57 GMT]]></title><description><![CDATA[<p>Th schrieb:</p>
<blockquote>
<p>Aber die Frage ist sowieso, ob hierfür eine deque benutzt werden sollte (da diese nur zusätzliche Vorteile beim Anfügen an die erste Position bringt - gegenüber einem vector).</p>
<p>Und stimme dir zu: wenn die Größe von vornherein feststeht, dann einfach ein konstantes Array aufbauen (ist schneller, da nicht immer wieder reallokiert werden muß).</p>
</blockquote>
<p>Okay, dann erklär ich kurz, wieso deque (wird aber kompliziert :))</p>
<p>Ich bekomme sequenziell eine große Menge von ints. Über diese gehe ich mit einem Fenster konstanter Länge drüber. Das sieht dann so aus:</p>
<pre><code class="language-cpp">deque&lt;int&gt; _deq;
map&lt;deque&lt;int&gt;, int&gt; _slidingWindowMap;

void addInt(const int &amp; a) {
    if (_deq.size() &gt;= MAXSIZE) {
        _deq.pop_front();
    }
    _deq.push_back(a);
...
</code></pre>
<p>Jetzt suche ich alle möglichen Sequenzen innerhalb dieser deque.<br />
Wenn in der also 1,2,3,4,5 drinsteht, dann erzeuge ich mit folgende neue Zahlenketten daraus:</p>
<pre><code>1,2     1,2,3     1,2,3,4     1,2,3,4,5
2,3     2,3,4     2,3,4,5
3,4     3,4,5
4,5
</code></pre>
<p>Das sieht so aus:</p>
<pre><code class="language-cpp">... // Fortsetzung addInt()

deque&lt;int&gt; tdeque(11);
unsigned int pos; // pos = starting position for small interval that has to be saved

for (unsigned int i = 2; ( (i &lt;= MAXSIZE) &amp;&amp; (i &lt;= _deq.size())); i++) {
    // i == size of small interval
    tdeque.clear();
    tdeque.resize(11);
    if (_deq.size() &lt; MAXSIZE) { // check if _deq is not big enough (thats the case at beginning of program)
        pos = _deq.size() -i;
    } else {
        pos = MAXSIZE -i;
    }
    for (unsigned int j = 0; j &lt; i; j++) {
        tdeque.push_back(_deq.at(pos+j));
    } // for
    _slidingWindowMap[tdeque]++; // if tdeque is present, inc its counter, otherwise insert it with counter set to 1
} // for
</code></pre>
<p>Und diese deques (1,2 2,3 etc (sind in tdeque)) will ich in ihrer Häufigkeit zählen.</p>
<p>Ich hoffe, ich habe jetzt im Code hierdrüber keine Fehler eingebaut. Ist so aus meinem Prog übernommen.</p>
<p>Jetzt, wo ich das abtippe und drüber nachdenke, kann ich aber auch nicht mehr sagen, wieso ich da eigentlich deques abspeichere. Da brauch ich die Fähigkeit mit pop_front ja gar nicht...<br />
Hätte also auch ein Vector ausgereicht...<br />
Naja, gut, wenn man selbst mal über seinen Code nachdenkt <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>Th schrieb:</p>
<blockquote>
<p>P.S: Ich habe auch eine eigene Array-Klasse mit maximaler Größe (bzw. 2, da eine die max. Größe als Template-Parameter nimmt, die andere als Parameter im Konstruktor).Bei Bedarf verschicke ich sie gerne...</p>
</blockquote>
<p>Gern. benja a t gmx. net</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1056253</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1056253</guid><dc:creator><![CDATA[Benja_m]]></dc:creator><pubDate>Fri, 12 May 2006 09:17:57 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherverbrauch std::map &amp;amp; Membervariablen on Mon, 15 May 2006 08:55:27 GMT]]></title><description><![CDATA[<p>Soo, wie vermutet liegt es an dem Konstrukt</p>
<pre><code class="language-cpp">map&lt;deque&lt;int&gt;, int&gt;
</code></pre>
<p>das habe ich ersetzt duch</p>
<pre><code class="language-cpp">map&lt;vector&lt;int&gt;, int&gt;
</code></pre>
<p>und der Verbrauch von Arbeitsspeicher ist jetzt in Regionen, die ich überschauen und nachvollziehen kann.</p>
<p>Mein Problem ist also gelöst. Danke nochmal an CStoll, Th und die anderen netten Helfer !!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1057939</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1057939</guid><dc:creator><![CDATA[Benja_m]]></dc:creator><pubDate>Mon, 15 May 2006 08:55:27 GMT</pubDate></item></channel></rss>