<?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[new und delete-Operatoren]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich frage mich, in welchen Fällen man den new- bzw. delete-Operator braucht?</p>
<p>Eine Antwort könnte jetzt sein: Weil man damit Speicher dynamisch aufrufen kann.</p>
<p>Kann mir jemand mal ein Code-Beispiel schicken, in dem man new und delete ZWINGEND anwenden muss, damit das Programm richtig bzw. überhaupt funktionieren kann?<br />
Denn wenn man new und delete andauernd verwenden würde, dann würde ein riesiger Code auf einen warten (denn ein neuer Datentyp (Array) muss ja wieder deleted werden).</p>
<p>Danke im Voraus!</p>
<p>MfG</p>
<p>Seikuassi</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/318089/new-und-delete-operatoren</link><generator>RSS for Node</generator><lastBuildDate>Mon, 27 Jul 2026 11:52:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/318089.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 30 Jun 2013 18:16:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to new und delete-Operatoren on Sun, 30 Jun 2013 18:16:24 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich frage mich, in welchen Fällen man den new- bzw. delete-Operator braucht?</p>
<p>Eine Antwort könnte jetzt sein: Weil man damit Speicher dynamisch aufrufen kann.</p>
<p>Kann mir jemand mal ein Code-Beispiel schicken, in dem man new und delete ZWINGEND anwenden muss, damit das Programm richtig bzw. überhaupt funktionieren kann?<br />
Denn wenn man new und delete andauernd verwenden würde, dann würde ein riesiger Code auf einen warten (denn ein neuer Datentyp (Array) muss ja wieder deleted werden).</p>
<p>Danke im Voraus!</p>
<p>MfG</p>
<p>Seikuassi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335547</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335547</guid><dc:creator><![CDATA[PHBU]]></dc:creator><pubDate>Sun, 30 Jun 2013 18:16:24 GMT</pubDate></item><item><title><![CDATA[Reply to new und delete-Operatoren on Sun, 30 Jun 2013 18:21:06 GMT]]></title><description><![CDATA[<p>Seikuassi schrieb:</p>
<blockquote>
<p>ich frage mich, in welchen Fällen man den new- bzw. delete-Operator braucht?</p>
</blockquote>
<p>nie (na gut, fast nie).<br />
Die Operatoren werden von der Standardbibliothek (indirekt) verwendet um dynamisch wachsende Arrays (std::vector), verkettete Listen (std::list) und alle anderen Container zu realisieren, aber als User sollte man mit denen nie (na gut, selten) in Kontakt kommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335550</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sun, 30 Jun 2013 18:21:06 GMT</pubDate></item><item><title><![CDATA[Reply to new und delete-Operatoren on Sun, 30 Jun 2013 18:24:57 GMT]]></title><description><![CDATA[<p>Die Antwort hast du ja bereits selbst (teilweise) gegeben. Immer dann, wenn man Speicher benötigt, dessen Größe zur Laufzeit nicht bekannt ist oder die benötigte Menge über die Stackgrenze hinaus geht.</p>
<p>Die STL bietet jedoch eine gute Auswahl an Containern, welche Dir die Arbeit abnehmen. Nutze sie!</p>
<p>Darüber hinaus gibt es noch smart-pointer. Nutze sie!</p>
<p>In allen anderen Fällen gilt: Zu jedem new ein delete (zu jeden new[] ein delete[]). Soviel Schreibarbeit ist das nun auch nicht.</p>
<p>Ave</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335553</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335553</guid><dc:creator><![CDATA[Stechus Kaktus]]></dc:creator><pubDate>Sun, 30 Jun 2013 18:24:57 GMT</pubDate></item><item><title><![CDATA[Reply to new und delete-Operatoren on Sun, 30 Jun 2013 18:28:07 GMT]]></title><description><![CDATA[<p>Hallo Nathan,</p>
<p>Nathan schrieb:</p>
<blockquote>
<p>(na gut, fast nie)</p>
</blockquote>
<p>Und wann muss man diese Operatoren nun nehmen (soll nicht als provozierend gelten, aber ich würde es nun mal gerne wissen)? Denn new und delete sind ja C++-Style, wenn ich mich nicht irre. malloc und free sind ja C-Style.</p>
<p>Danke im Voraus!</p>
<p>MfG</p>
<p>Seikuassi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335554</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335554</guid><dc:creator><![CDATA[PHBU]]></dc:creator><pubDate>Sun, 30 Jun 2013 18:28:07 GMT</pubDate></item><item><title><![CDATA[Reply to new und delete-Operatoren on Sun, 30 Jun 2013 18:38:15 GMT]]></title><description><![CDATA[<p>Stechus Kaktus schrieb:</p>
<blockquote>
<p>In allen anderen Fällen.</p>
</blockquote>
<p>Jetzt gibt es doch wirklich keine Fällt mehr, wo du new brauchst, wegen:<br />
-STL Container<br />
-Smart-Pointer<br />
-make_shared<br />
-make_unique</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335559</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335559</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Sun, 30 Jun 2013 18:38:15 GMT</pubDate></item><item><title><![CDATA[Reply to new und delete-Operatoren on Sun, 30 Jun 2013 18:39:42 GMT]]></title><description><![CDATA[<p>Seikuassi schrieb:</p>
<blockquote>
<p>Hallo Nathan,</p>
<p>Nathan schrieb:</p>
<blockquote>
<p>(na gut, fast nie)</p>
</blockquote>
<p>Und wann muss man diese Operatoren nun nehmen (soll nicht als provozierend gelten, aber ich würde es nun mal gerne wissen)?</p>
</blockquote>
<p>Für Polymorphie. Da braucht man Zeiger/Referenzen auf Basisklassen, die man mit verschiedenen abgeleiteten Klassen initialisiert. Da nimmt man idR einen std::vector&lt;std::shared_ptr&lt;type&gt;&gt; und initialisiert die dann mit container[i] = new sth. Aber dank Smartptr, braucht man nur new davon, das delete wird automatisch erledigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335560</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335560</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sun, 30 Jun 2013 18:39:42 GMT</pubDate></item><item><title><![CDATA[Reply to new und delete-Operatoren on Sun, 30 Jun 2013 18:47:01 GMT]]></title><description><![CDATA[<p>Willst du denn unbedingt alle polymorphen Objekte einzeln auf den Heap legen?</p>
<p>Ich sag nicht, dass das nicht auch mal richtig sein kann, aber es gibt auch andere Methoden. Du brauchst schließlich nur Zeiger/Referenzen, was nicht zwangsläufig new/delete bedeutet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335563</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335563</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 30 Jun 2013 18:47:01 GMT</pubDate></item><item><title><![CDATA[Reply to new und delete-Operatoren on Sun, 30 Jun 2013 18:48:58 GMT]]></title><description><![CDATA[<p>Du brauchst new, wenn du ein Objekt über den Scope hinaus am Leben erhalten musst, aus welchen Gründen auch immer, z.B. weil du das Objekt nicht kopieren darfst, und deswegen Zeiger hin und her reichst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335564</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335564</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Sun, 30 Jun 2013 18:48:58 GMT</pubDate></item><item><title><![CDATA[Reply to new und delete-Operatoren on Sun, 30 Jun 2013 18:51:40 GMT]]></title><description><![CDATA[<p>Die Frage ist genau so sinnvoll wie &quot;wann muss man den + Operator verwenden?&quot;. Wenn du ein Beispiel zum Üben brauchst: Schreib z.B. ein Programm in das der Benutzer so lange verschiedene Wörter eingeben kann, bis er einen . eingibt und danach dein Programm fragen kann, ob ein bestimmtes Wort unter den zuvor eingegebenen Wörter vorkommt oder nicht. <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/2335566</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335566</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Sun, 30 Jun 2013 18:51:40 GMT</pubDate></item><item><title><![CDATA[Reply to new und delete-Operatoren on Sun, 30 Jun 2013 18:57:27 GMT]]></title><description><![CDATA[<p>Ist deine Frage wozu man Freispeicher allgmein braucht oder warum man new/delete malloc/free gegenüber bevorzugen sollte?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335570</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335570</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sun, 30 Jun 2013 18:57:27 GMT</pubDate></item><item><title><![CDATA[Reply to new und delete-Operatoren on Sun, 30 Jun 2013 19:00:55 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Willst du denn unbedingt alle polymorphen Objekte einzeln auf den Heap legen?</p>
<p>Ich sag nicht, dass das nicht auch mal richtig sein kann, aber es gibt auch andere Methoden. Du brauchst schließlich nur Zeiger/Referenzen, was nicht zwangsläufig new/delete bedeutet.</p>
</blockquote>
<p>Ja, klar.<br />
Aber wenn man die Anzahl vorher nicht kennt, muss man es.<br />
Und das meinte ich auch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335571</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335571</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sun, 30 Jun 2013 19:00:55 GMT</pubDate></item><item><title><![CDATA[Reply to new und delete-Operatoren on Sun, 30 Jun 2013 19:13:15 GMT]]></title><description><![CDATA[<p>out schrieb:</p>
<blockquote>
<p>Jetzt gibt es doch wirklich keine Fällt mehr, wo du new brauchst [...]</p>
</blockquote>
<p>Mir fällt jetzt auch kein Beispiel ein, wann ich zuletzt eine pure new-delete-Kombination verwandt habe. Es ist der Vollständigkeit willen aufgeführt. Defensive Consulting sozusagen.</p>
<p>Ave</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335573</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335573</guid><dc:creator><![CDATA[Stechus Kaktus]]></dc:creator><pubDate>Sun, 30 Jun 2013 19:13:15 GMT</pubDate></item><item><title><![CDATA[Reply to new und delete-Operatoren on Sun, 30 Jun 2013 19:39:35 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Ja, klar.<br />
Aber wenn man die Anzahl vorher nicht kennt, muss man es.<br />
Und das meinte ich auch.</p>
</blockquote>
<p>vector und andere Container?</p>
<p>vector&lt;derived_1&gt; derived_1s;<br />
vector&lt;derived_2&gt; derived_2s;</p>
<p>// Erzeuge so viele derived_1 und 2 wie nötig</p>
<p>vector&lt;base*&gt; foo; // Enthält passende Zeiger auf Elemente in derived_1s und derived_2s</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335577</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335577</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 30 Jun 2013 19:39:35 GMT</pubDate></item><item><title><![CDATA[Reply to new und delete-Operatoren on Mon, 01 Jul 2013 06:24:14 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Nathan schrieb:</p>
<blockquote>
<p>Ja, klar.<br />
Aber wenn man die Anzahl vorher nicht kennt, muss man es.<br />
Und das meinte ich auch.</p>
</blockquote>
<p>vector und andere Container?</p>
<p>vector&lt;derived_1&gt; derived_1s;<br />
vector&lt;derived_2&gt; derived_2s;</p>
<p>// Erzeuge so viele derived_1 und 2 wie nötig</p>
<p>vector&lt;base*&gt; foo; // Enthält passende Zeiger auf Elemente in derived_1s und derived_2s</p>
</blockquote>
<p>Also foo soll Zeiger in dieser Form enthalten?</p>
<p>foo.push_back(&amp;derived_1s[x]);</p>
<p>Ja schön und gut, nur können die ungültig werden, wenn man derived_1s weitere Elemente hinzufügt und der vector umkopieren muss.</p>
<p>Ich finde, die sich hier breitmachende Angst vor jedem new, nimmt Bizarre Formen an. V.a. in Kombination mit Smart-Pointern kann ich nicht ganz nachvollziehen, warum man krampfhaft jedes new vermeiden will.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335654</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335654</guid><dc:creator><![CDATA[CreativeLabs]]></dc:creator><pubDate>Mon, 01 Jul 2013 06:24:14 GMT</pubDate></item><item><title><![CDATA[Reply to new und delete-Operatoren on Mon, 01 Jul 2013 08:02:36 GMT]]></title><description><![CDATA[<p>CreativeLabs schrieb:</p>
<blockquote>
<p>Ja schön und gut, nur können die ungültig werden, wenn man derived_1s weitere Elemente hinzufügt und der vector umkopieren muss.</p>
</blockquote>
<p>1. Dann nimm eben nicht vector<br />
2. Du weißt als Programmierer genau, wann die Elemente ungültig werden. vector ist in dieser Hinsicht absolut deterministisch.<br />
3. Dazu sind komplexe Datentypen da: Fass alles zusammen. Einfügen mit Reallokation führt zu Aktualisierung der Liste.</p>
<blockquote>
<p>Ich finde, die sich hier breitmachende Angst vor jedem new, nimmt Bizarre Formen an. V.a. in Kombination mit Smart-Pointern kann ich nicht ganz nachvollziehen, warum man krampfhaft jedes new vermeiden will.</p>
</blockquote>
<p>Dann hast du meine Botschaft nicht verstanden. Es ging mir nicht um new/delete, sondern darum, Nathan ein paar neue Denkanstöße zu geben. Denn: Die Elemente alle gemeinsam im Speicher zu halten ist <em>effizienter</em>.</p>
<p>Indirekt ist das natürlich auch ein Punkt gegen new/delete für Einzelobjekte, da es eben diese Art von Speicherzerhackstückelung fördert. Das gilt aber auch für einige der Container wie z.B. list, die ansonsten kaum Vorteile bieten, die diesen Nachteil zu rechtfertigen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335667</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335667</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 01 Jul 2013 08:02:36 GMT</pubDate></item><item><title><![CDATA[Reply to new und delete-Operatoren on Mon, 01 Jul 2013 12:03:47 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Dann hast du meine Botschaft nicht verstanden. Es ging mir nicht um new/delete, sondern darum, Nathan ein paar neue Denkanstöße zu geben. Denn: Die Elemente alle gemeinsam im Speicher zu halten ist <em>effizienter</em>.</p>
</blockquote>
<p>Und das ist dir gelungen.<br />
Ich hatte so etwas gar nicht auf dem Plan, schon allein, weil mir das zu viel Arbeit wäre.<br />
Da hätte ich doch tatsächlich so etwas in der Art in einen Allokator gepackt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335726</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335726</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Mon, 01 Jul 2013 12:03:47 GMT</pubDate></item><item><title><![CDATA[Reply to new und delete-Operatoren on Mon, 01 Jul 2013 12:30:44 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Ich hatte so etwas gar nicht auf dem Plan, schon allein, weil mir das zu viel Arbeit wäre.<br />
Da hätte ich doch tatsächlich so etwas in der Art in einen Allokator gepackt...</p>
</blockquote>
<p>Kommt ungefähr auf gleiche raus, aber ich fände meine Methode weniger Arbeit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335732</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335732</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 01 Jul 2013 12:30:44 GMT</pubDate></item><item><title><![CDATA[Reply to new und delete-Operatoren on Mon, 01 Jul 2013 12:44:43 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Kommt ungefähr auf gleiche raus, aber ich fände meine Methode weniger Arbeit.</p>
</blockquote>
<p>Deine Methode ist sogar kontraproduktiv.</p>
<pre><code class="language-cpp">vector&lt;unique_ptr&lt;base&gt; &gt; foo;

for (int i=0; i&lt;howmany; ++i) {
    foo.push_back(unique_ptr&lt;base&gt;(new derived_1()));
    foo.push_back(unique_ptr&lt;base&gt;(new derived_2()));
}

int sum = 0;
for (int i=0; i&lt;howoften; ++i) {
    for (auto&amp; b : foo) {
        sum += b-&gt;foo();
  }
}
</code></pre>
<p><a href="http://ideone.com/SV16dd" rel="nofollow">http://ideone.com/SV16dd</a><br />
0.87s</p>
<pre><code class="language-cpp">vector&lt;derived_1&gt; derived_1s;
vector&lt;derived_2&gt; derived_2s;

for (int i=0; i&lt;howmany; ++i)
    derived_1s.push_back(derived_1());
for (int i=0; i&lt;howmany; ++i)
    derived_2s.push_back(derived_2());

vector&lt;base*&gt; foo;

for (int i=0; i&lt;howmany; ++i) {
    foo.push_back(&amp;derived_1s[i]);
    foo.push_back(&amp;derived_2s[i]);
}

int sum = 0;
for (int i=0; i&lt;howoften; ++i) {
    for (base* b : foo) {
        sum += b-&gt;foo();
  }
}
</code></pre>
<p><a href="http://ideone.com/s48f7X" rel="nofollow">http://ideone.com/s48f7X</a><br />
1.60s</p>
<pre><code class="language-cpp">deque&lt;derived_1&gt; derived_1s;
deque&lt;derived_2&gt; derived_2s;

for (int i=0; i&lt;howmany; ++i)
    derived_1s.push_back(derived_1());
for (int i=0; i&lt;howmany; ++i)
    derived_2s.push_back(derived_2());

vector&lt;base*&gt; foo;

for (int i=0; i&lt;howmany; ++i) {
    foo.push_back(&amp;derived_1s[i]);
    foo.push_back(&amp;derived_2s[i]);
}

int sum = 0;
for (int i=0; i&lt;howoften; ++i) {
    for (base* b : foo) {
        sum += b-&gt;foo();
  }
}
</code></pre>
<p><a href="http://ideone.com/Tr7dlD" rel="nofollow">http://ideone.com/Tr7dlD</a><br />
0.83s</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335736</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335736</guid><dc:creator><![CDATA[vectorsucks]]></dc:creator><pubDate>Mon, 01 Jul 2013 12:44:43 GMT</pubDate></item><item><title><![CDATA[Reply to new und delete-Operatoren on Mon, 01 Jul 2013 12:54:43 GMT]]></title><description><![CDATA[<p>Und, war es schwierig, einen Benchmark so zu manipulieren, dass er genau den einen kleinen Nachteil von vector gegenüber deque übermäßig hervorhebt, ohne dass die Nachteile der deque zum Vorschein kommen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335739</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335739</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 01 Jul 2013 12:54:43 GMT</pubDate></item><item><title><![CDATA[Reply to new und delete-Operatoren on Mon, 01 Jul 2013 13:01:02 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Und, war es schwierig, einen Benchmark so zu manipulieren, dass er genau den einen kleinen Nachteil von vector gegenüber deque übermäßig hervorhebt, ohne dass die Nachteile der deque zum Vorschein kommen?</p>
</blockquote>
<p>Wovon redest du?<br />
Die Allokationszeit ist in diesem Benchmark völlig nebensächlich. Es geht um deinen &quot;Trick&quot;, die Sachen &quot;kompakt&quot; zu speichern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335741</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335741</guid><dc:creator><![CDATA[vectorsucks]]></dc:creator><pubDate>Mon, 01 Jul 2013 13:01:02 GMT</pubDate></item><item><title><![CDATA[Reply to new und delete-Operatoren on Mon, 01 Jul 2013 13:06:27 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Nathan schrieb:</p>
<blockquote>
<p>Ich hatte so etwas gar nicht auf dem Plan, schon allein, weil mir das zu viel Arbeit wäre.<br />
Da hätte ich doch tatsächlich so etwas in der Art in einen Allokator gepackt...</p>
</blockquote>
<p>Kommt ungefähr auf gleiche raus, aber ich fände meine Methode weniger Arbeit.</p>
</blockquote>
<p>Naja, ich finde einmal Arbeit und initialisieren und dann keinen Mehraufwand, vs Mehraufwand beim Einfügen (jetzt rein codetechnisch) da das erste besser. (Toller Satz)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335743</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335743</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Mon, 01 Jul 2013 13:06:27 GMT</pubDate></item><item><title><![CDATA[Reply to new und delete-Operatoren on Mon, 01 Jul 2013 13:12:44 GMT]]></title><description><![CDATA[<p>vectorsucks schrieb:</p>
<blockquote>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Und, war es schwierig, einen Benchmark so zu manipulieren, dass er genau den einen kleinen Nachteil von vector gegenüber deque übermäßig hervorhebt, ohne dass die Nachteile der deque zum Vorschein kommen?</p>
</blockquote>
<p>Wovon redest du?<br />
Die Allokationszeit ist in diesem Benchmark völlig nebensächlich.</p>
</blockquote>
<p>Die ist es, die du hauptsächlich misst. Mach mal richtig Arbeit mit den Objekten:</p>
<pre><code>const int howmany  = 100*1000;
  const int howoften = 100*1000;
</code></pre>
<p>Zack! Schon zieht der vector gegenüber new/delete davon. Bloß die deque hält immer noch mit (oder führt sogar!), da sie hier in diesem Benchmark keinen Zugriffsnachteil gegenüber dem vector hat (da alles über Zeiger geht), aber dafür schneller allokiert. Ich revidiere leicht meine Empfehlung:</p>
<pre><code>deque&lt;derived_1&gt; derived_1s;
deque&lt;derived_2&gt; derived_2s;

// Erzeuge super-schnell so viele derived_1 und 2 wie nötig

vector&lt;base*&gt; foo; // Enthält passende Zeiger auf Elemente in derived_1s und derived_2s und hat vectorschnellen Zugriff auf ziemlich lokalisierte Objekte.
</code></pre>
<p>Falls man jedoch eher selten Allokationen hat, ist die deque hier aber eher als Mikoroptimierung für Klugscheißer zu sehen. Immerhin hat sie aber keine Nachteile und sollte daher genommen werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335746</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335746</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 01 Jul 2013 13:12:44 GMT</pubDate></item><item><title><![CDATA[Reply to new und delete-Operatoren on Mon, 01 Jul 2013 13:32:46 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>vector&lt;base*&gt; foo; // Enthält passende Zeiger auf Elemente in derived_1s und derived_2s und hat vectorschnellen Zugriff auf ziemlich lokalisierte Objekte.[/code]Falls man jedoch eher selten Allokationen hat, ist die deque hier aber eher als Mikoroptimierung für Klugscheißer zu sehen. Immerhin hat sie aber keine Nachteile und sollte daher genommen werden.</p>
</blockquote>
<p>Du hast es immer noch nicht ganz kapiert.</p>
<p>Hier der gleiche Benchmark, bei dem <em>ausschliesslich</em> die Zugriffszeiten gemessen wurden:<br />
deque: 3.48s<br />
vector: 6.58s<br />
new/delete: 4.98s</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335753</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335753</guid><dc:creator><![CDATA[vectorsucks]]></dc:creator><pubDate>Mon, 01 Jul 2013 13:32:46 GMT</pubDate></item><item><title><![CDATA[Reply to new und delete-Operatoren on Mon, 01 Jul 2013 13:47:45 GMT]]></title><description><![CDATA[<p>Erstaunlich. Bloß, dass bei mir was komplett anderes rauskommt. Letzteres finde ich wiederum nicht erstaunlich, sondern ist genau das was ich bei einem Beitrag von dir erwartet hätte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335760</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335760</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 01 Jul 2013 13:47:45 GMT</pubDate></item><item><title><![CDATA[Reply to new und delete-Operatoren on Mon, 01 Jul 2013 14:31:46 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Erstaunlich. Bloß, dass bei mir was komplett anderes rauskommt. Letzteres finde ich wiederum nicht erstaunlich, sondern ist genau das was ich bei einem Beitrag von dir erwartet hätte.</p>
</blockquote>
<p>Was soll das heissen?</p>
<p><code>-Ofast -march=native</code></p>
<pre><code class="language-cpp">int howmany, howoften; cin &gt;&gt; howmany &gt;&gt; howoften;
</code></pre>
<p>Eingabe &quot;20000 20000&quot;<br />
sowie</p>
<pre><code class="language-cpp">auto start = clock();

  int sum = 0;
  for (int i=0; i&lt;howoften; ++i) {
    for (base* b : foo) {
      sum += b-&gt;foo();
    }
  }
  auto end = clock();
  std::cout &lt;&lt; setprecision(10) &lt;&lt; static_cast&lt;double&gt;(end - start) / CLOCKS_PER_SEC &lt;&lt; &quot;s&quot;\n&quot;;
</code></pre>
<p>Das kann nicht gefälscht sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335775</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335775</guid><dc:creator><![CDATA[vectorsucks]]></dc:creator><pubDate>Mon, 01 Jul 2013 14:31:46 GMT</pubDate></item><item><title><![CDATA[Reply to new und delete-Operatoren on Mon, 01 Jul 2013 14:49:16 GMT]]></title><description><![CDATA[<p>vectorsucks schrieb:</p>
<blockquote>
<p>Hier der gleiche Benchmark, bei dem <em>ausschliesslich</em> die Zugriffszeiten gemessen wurden:<br />
deque: 3.48s<br />
vector: 6.58s<br />
new/delete: 4.98s</p>
</blockquote>
<p>Interessante Ergebnisse. Aber repräsentativ? Ich denke eher nicht. Ich denke, es ist eher zu künstlich (das Programm tut nichts anderes) und speziell (Allozierungsreihenfolge).</p>
<p>Im Falle von new/delete hast du wahrscheinlich das Glück, dass die allozierten Objekte alle in mehr oder weniger in derselben Reihenfolge hintereinander im Speicher stehen, wie du sie hinterher besuchst. Das verwundert nicht besonders, wenn das Program sonst nichts anderes macht. Lass es länger laufen, hier und da mal was löschen, hier und da mal wieder etwas hinzufügen, noch anderen Kram den Heap benutzen lassen und irgendwann stehen die Objekte relativ willkürlich im Speicher und auf einmal wird's wieder ganz langsam, weil der Cache das Zugriffsmuster nicht mehr erkennen kann und dementsprechend keinen vernünftigen Prefetch machen kann.</p>
<p>Ist sicher mal interessant, sich anzuschauen, wie die Objekte im Speicher stehen; denn ich denke, dass das hauptausschlaggebend bzgl Laufzeit ist.</p>
<p>Das könnte hier z.B. so aussehen:</p>
<pre><code>dx = das x-te derived1-objekt
ex = das x-te derived2-objekt

deque     : d0 d1 d2 d3   e0 e1 e2 e3   d4 d5 d6 d7   e4 e5 e6 e7   d8 d9 ...

vector    : d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 ...   e0 e1 e2 e3 e4 e5 e6 e7 e8 ...

new/delete: d0  e0  d1  e1  d2  e2  d3  e3  d4  e4  d5  e5  d6  e6  d7  e7 ...
</code></pre>
<p>Also: bei den deques wechsseln sich die Blöcke von derived1 und derived2 Objekten ab. Warum? Weil der Heap komplett frei war, die Heap-Zuteilung hintereinander liegende Blöcke rausgegeben hat und dequeue so ähnlich wie vector&lt;vector&lt;&gt;&gt; funzt, wobei die inneren Vektoren eine feste Blockgröße haben und vielleicht noch verlinkt sind, damit das Iterieren schneller geht.</p>
<p>Jetzt könnte man noch <code>vector&lt;pair&lt;derived_1,derived_2&gt;&gt;</code> testen. <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/2335776</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335776</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 01 Jul 2013 14:49:16 GMT</pubDate></item></channel></rss>