<?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[memory management]]></title><description><![CDATA[<p>Hi,</p>
<p>Ich habe nun endlich meine Template Stringklasse fertig, jedoch bin ich nicht wirklich mit der Performance der Klasse zufrieden. Besonders bei meinen Elementfunktionen Append und Insert die eine Zeichenkette an den Anfang oder das Ende des Strings schreiben. Ich zeige einfach mal den Quelltext und schildere dann mein Problem.</p>
<pre><code class="language-cpp">void Append(const ARG_TYPE* pString) {

     if(m_uiLength == 0) {

          m_uiLength = MyStd::StrLen(pString);

	    m_pString = new ARG_TYPE[m_uiLength + 1];

	    MyStd::StrCpy(m_pString, pString);

	    m_pString[m_uiLength] = '\0';

	    return;
	}

	ARG_TYPE* pStrCpy = new ARG_TYPE[m_uiLength + 1];
	if(pStrCpy == NULL) return;
	MyStd::StrCpy(pStrCpy, m_pString);

	m_uiLength += MyStd::StrLen(pString);

	DEL_ARRAY(m_pString);

	m_pString = new ARG_TYPE[m_uiLength + 1];
	if(m_pString == NULL) return;

	MyStd::StrCpy(m_pString, pStrCpy);

	DEL_ARRAY(pStrCpy);

	MyStd::StrCat(m_pString, pString);

	m_pString[m_uiLength] = '\0';

	return;
}
</code></pre>
<p>Wie ihr seht verwende ich new und delete um Speicher zu reservieren und wieder freizugeben. Leider gibt es ja keinen Operator welcher mir einen Speicherbereich reallokiert(wie bei realloc()), also lege ich in der oben genannten Funktion eine Sicherheitskopie des vorherigen Strings, ermittle die Länge der übergebenen Zeichenkette und reserviere Speicher für den kompletten String und kopiere alles wieder rein. Bei einem Funktionsaufruf ist ja noch alles locker, aber wenn ich ein Stringobjekt erstelle und in einer Schleife 65535x diese Funktion aufrufe dauert die ganze Kopiererei mindestens 6 Sekunden,<br />
wie ich finde ist das echt langsam(P4 3000GHZ). Wenn ich nun den new und delete<br />
Operator durch malloc, realloc und free ersetze dauert die ganze Aktion &quot;nur&quot; noch 1 - 2 Sekunden(warscheinlich wegen realloc und der entfallenen Sicherheitskopie). Kennt jemand eine Optimierungsmöglichkeit für das Problem(bitte keine STL).</p>
<p>cya,<br />
DEADBEEF</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/154855/memory-management</link><generator>RSS for Node</generator><lastBuildDate>Thu, 23 Jul 2026 18:21:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/154855.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 31 Jul 2006 12:33:19 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to memory management on Mon, 31 Jul 2006 12:33:19 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>Ich habe nun endlich meine Template Stringklasse fertig, jedoch bin ich nicht wirklich mit der Performance der Klasse zufrieden. Besonders bei meinen Elementfunktionen Append und Insert die eine Zeichenkette an den Anfang oder das Ende des Strings schreiben. Ich zeige einfach mal den Quelltext und schildere dann mein Problem.</p>
<pre><code class="language-cpp">void Append(const ARG_TYPE* pString) {

     if(m_uiLength == 0) {

          m_uiLength = MyStd::StrLen(pString);

	    m_pString = new ARG_TYPE[m_uiLength + 1];

	    MyStd::StrCpy(m_pString, pString);

	    m_pString[m_uiLength] = '\0';

	    return;
	}

	ARG_TYPE* pStrCpy = new ARG_TYPE[m_uiLength + 1];
	if(pStrCpy == NULL) return;
	MyStd::StrCpy(pStrCpy, m_pString);

	m_uiLength += MyStd::StrLen(pString);

	DEL_ARRAY(m_pString);

	m_pString = new ARG_TYPE[m_uiLength + 1];
	if(m_pString == NULL) return;

	MyStd::StrCpy(m_pString, pStrCpy);

	DEL_ARRAY(pStrCpy);

	MyStd::StrCat(m_pString, pString);

	m_pString[m_uiLength] = '\0';

	return;
}
</code></pre>
<p>Wie ihr seht verwende ich new und delete um Speicher zu reservieren und wieder freizugeben. Leider gibt es ja keinen Operator welcher mir einen Speicherbereich reallokiert(wie bei realloc()), also lege ich in der oben genannten Funktion eine Sicherheitskopie des vorherigen Strings, ermittle die Länge der übergebenen Zeichenkette und reserviere Speicher für den kompletten String und kopiere alles wieder rein. Bei einem Funktionsaufruf ist ja noch alles locker, aber wenn ich ein Stringobjekt erstelle und in einer Schleife 65535x diese Funktion aufrufe dauert die ganze Kopiererei mindestens 6 Sekunden,<br />
wie ich finde ist das echt langsam(P4 3000GHZ). Wenn ich nun den new und delete<br />
Operator durch malloc, realloc und free ersetze dauert die ganze Aktion &quot;nur&quot; noch 1 - 2 Sekunden(warscheinlich wegen realloc und der entfallenen Sicherheitskopie). Kennt jemand eine Optimierungsmöglichkeit für das Problem(bitte keine STL).</p>
<p>cya,<br />
DEADBEEF</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1107739</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1107739</guid><dc:creator><![CDATA[0xDEADBEEF]]></dc:creator><pubDate>Mon, 31 Jul 2006 12:33:19 GMT</pubDate></item><item><title><![CDATA[Reply to memory management on Mon, 31 Jul 2006 12:54:32 GMT]]></title><description><![CDATA[<p>placement new, vielleicht noch einen speicherpool zum placement.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1107755</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1107755</guid><dc:creator><![CDATA[miller_m]]></dc:creator><pubDate>Mon, 31 Jul 2006 12:54:32 GMT</pubDate></item><item><title><![CDATA[Reply to memory management on Mon, 31 Jul 2006 13:27:58 GMT]]></title><description><![CDATA[<p>placement new sagt mir leider nichts... Kannst du das noch etwas erklären???</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1107778</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1107778</guid><dc:creator><![CDATA[0xDEADBEEF]]></dc:creator><pubDate>Mon, 31 Jul 2006 13:27:58 GMT</pubDate></item><item><title><![CDATA[Reply to memory management on Mon, 31 Jul 2006 13:47:42 GMT]]></title><description><![CDATA[<p>du ersetzt die operatoren new und delete zb: für deine klasse somit könntest du eine eigene speicherwaltung schreiben. befrage doch mal google bzw. die forensuche dann wirst du auch konkrete beispiele finden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1107794</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1107794</guid><dc:creator><![CDATA[miller_m]]></dc:creator><pubDate>Mon, 31 Jul 2006 13:47:42 GMT</pubDate></item><item><title><![CDATA[Reply to memory management on Mon, 31 Jul 2006 13:53:22 GMT]]></title><description><![CDATA[<p>Du legst dir einfach einen dynamischen Speicherpool an, der groß genug ist, und wenn du Speicher reservieren willst, suchst du ein Element im Speicherpool, das gerade nicht benutzt wird.</p>
<p>Brauchst du den Speicher im Moment nicht mehr, markiert man das im Speicherpool, und wenn man gar keinen zusätzlichen Speicher mehr braucht, löscht man den Speicherpool.</p>
<p>Das geht einiges schneller, da der PC dann nur einmal nach freien Speicher suchen muss (wenn man den Speicherpool erstellt), und nicht in jedem Schleifendurchlauf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1107798</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1107798</guid><dc:creator><![CDATA[qasdfgh]]></dc:creator><pubDate>Mon, 31 Jul 2006 13:53:22 GMT</pubDate></item><item><title><![CDATA[Reply to memory management on Mon, 31 Jul 2006 17:11:26 GMT]]></title><description><![CDATA[<p>Bevor du mittels alternativem Speichermanagement optimierst, würde ich erstmal grundsätzlich an deiner String Klasse optimieren. So wie es aussieht, kapselt deine Klasse einfach einen C-String. Das ist Müll! Gerade bei append Aufrufen merkt man das, da immer erst der komplette String durchiteriert werden muss, um an die Länge zu kommen. Du hast zwar die Membervariable m_uiLength, ich frage mich nur wozu, wenn die bei StrCat nicht zum Einsatz kommt. Verwende ein vernünftiges String Layout. Ein simples unformatiertes Zeichenarray mit Längenvariable reicht ja vollkommen aus.<br />
Zudem solltest du dir eine Strategie für das Reservieren und Freigeben von Speicher einfallen lassen. Du musst zB nicht immer reservieren. Wenn der vorhandene Speicher noch ausreicht um die entsprechenden Zeichen anzuhängen, gibt es keinen Grund für new. Damit das funktioniert, muss man natürlich irgendwann mal etwas mehr Speicher als notwendig reserviert haben. In meiner Klasse benutze ich zB einen Faktor von 1,5. Wenn dem String zB 20 Zeichen zugewiesen werden, reserviere ich 30. Bei den nächsten 10 angefügten Zeichen muss also kein new aufgerufen werden. Erst beim 31. Zeichen ist es wieder notwendig, und dann werden wieder 1,5 mal soviel Speicher wie notwendig reserviert. Natürlich steigt damit der Speicherverbrauch. Mit Policies kann man das aber gut steuern und so den optimalen Faktor bestimmen. Du kannst dir natürlich auch was Ausgefalleneres ausdenken. <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>Ich verstehe auch nicht, warum du von m_pString erst eine Kopie machst. Reicht denn ein temporärer Zeiger nicht aus?</p>
<pre><code class="language-cpp">tmp = new ...
copy(tmp, old)
append(tmp, parameter)
delete old
old = tmp
</code></pre>
<p>Ausserdem kannst du Sachen wie</p>
<pre><code class="language-cpp">if(pStrCpy == NULL) return;
</code></pre>
<p>weglassen. new liefert _niemals_ einen Nullzeiger zurück. Das ist nur bei new(nothrow) der Fall.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1107907</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1107907</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Mon, 31 Jul 2006 17:11:26 GMT</pubDate></item></channel></rss>