<?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[Warum]]></title><description><![CDATA[<p>Warum hat sich das C++ Komitee dagegen entschieden ein realloc Äquivalent zu providen? (Nicht auf das &quot;providen&quot; achten, ich übe gerade hip zu sein.)</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/301496/warum</link><generator>RSS for Node</generator><lastBuildDate>Tue, 11 Aug 2026 23:50:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/301496.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 28 Mar 2012 17:30:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Warum on Wed, 28 Mar 2012 17:30:29 GMT]]></title><description><![CDATA[<p>Warum hat sich das C++ Komitee dagegen entschieden ein realloc Äquivalent zu providen? (Nicht auf das &quot;providen&quot; achten, ich übe gerade hip zu sein.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2196322</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2196322</guid><dc:creator><![CDATA[warum123456]]></dc:creator><pubDate>Wed, 28 Mar 2012 17:30:29 GMT</pubDate></item><item><title><![CDATA[Reply to Warum on Wed, 28 Mar 2012 17:40:50 GMT]]></title><description><![CDATA[<p>Wann und wie würdest du das denn benutzen? Und bitte bring ein Beispiel, wo man aus einem glaubwürdigen Grund nicht vector::resize benutzen würde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2196331</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2196331</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 28 Mar 2012 17:40:50 GMT</pubDate></item><item><title><![CDATA[Reply to Warum on Wed, 28 Mar 2012 17:46:31 GMT]]></title><description><![CDATA[<p>Muss vector::resize denn nicht new aufrufen, alles rüberkopieren und den alten Speicher dann löschen? (Vorausgesetzt capacity ist zu klein.) Mir scheint durch realloc könnte das wesentlich schneller durch das System geschehen, dass dann ja unabhängig entscheiden kann, ob es kopieren muss oder nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2196333</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2196333</guid><dc:creator><![CDATA[warum123456]]></dc:creator><pubDate>Wed, 28 Mar 2012 17:46:31 GMT</pubDate></item><item><title><![CDATA[Reply to Warum on Wed, 28 Mar 2012 17:53:06 GMT]]></title><description><![CDATA[<p>warum123456 schrieb:</p>
<blockquote>
<p>Mir scheint durch realloc könnte das wesentlich schneller durch das System geschehen, dass dann ja unabhängig entscheiden kann, ob es kopieren muss oder nicht.</p>
</blockquote>
<p>Abgesehen davon, dass realloc, wenn es denn kopieren muss, keine Ahnung von Konstruktoren, Destruktoren, Objektidentität etc hat, ja. Heißt etwas verallgemeinert, es würde nur für PODs was bringen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2196338</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2196338</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 28 Mar 2012 17:53:06 GMT</pubDate></item><item><title><![CDATA[Reply to Warum on Wed, 28 Mar 2012 17:54:46 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Abgesehen davon, dass realloc, wenn es denn kopieren muss, keine Ahnung von Konstruktoren, Destruktoren, Objektidentität etc hat, ja. Heißt etwas verallgemeinert, es würde nur für PODs was bringen.</p>
</blockquote>
<p>realloc haben wir ja schon, das brauchen wir nicht noch mal. Ich frage ja nach einem new Äquivalent, das hätte sich doch jetzt insbesondere mit RValue-Referenzen ganz gut gemacht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2196340</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2196340</guid><dc:creator><![CDATA[warum123456]]></dc:creator><pubDate>Wed, 28 Mar 2012 17:54:46 GMT</pubDate></item><item><title><![CDATA[Reply to Warum on Wed, 28 Mar 2012 18:07:26 GMT]]></title><description><![CDATA[<p>Spekulation: Weil es meistens nichts bringt und doch kopiert werden muss. Das geht ja ganz schnell:</p>
<pre><code class="language-cpp">void* p = malloc(1024);
void* q = malloc(16);
void* r = realloc(p, 2048);
</code></pre>
<p>Nur um das Prinzip zu verdeutlichen. Wenn der zweite Block direkt hinter dem ersten liegt, kann dieser nicht vergrößert werden. Nun mag man sich eine leicht schlauere Heapverwaltung vorstellen, aber irgendwo hat sowas ja auch seine Grenzen ...</p>
<p>Vielleicht weiß ja jemand genaueres.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2196343</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2196343</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Wed, 28 Mar 2012 18:07:26 GMT</pubDate></item><item><title><![CDATA[Reply to Warum on Thu, 29 Mar 2012 00:48:09 GMT]]></title><description><![CDATA[<p><code>realloc</code> lässt sich nicht sinnvoll für Non-PODs benutzen, weil besitzende Objekte nicht einfach im Speicher verschoben werden dürfen. Man bräuchte also eine andere Funktion für die Speicheranforderung. Zumindest so etwas wie <code>try_realloc</code> , um das genannte Problem zu verhindern.</p>
<p>*bla bla über Für und Wider auslass*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2196440</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2196440</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Thu, 29 Mar 2012 00:48:09 GMT</pubDate></item><item><title><![CDATA[Reply to Warum on Thu, 29 Mar 2012 06:56:34 GMT]]></title><description><![CDATA[<p>TyRoXx schrieb:</p>
<blockquote>
<p><code>realloc</code> lässt sich nicht sinnvoll für Non-PODs benutzen, weil besitzende Objekte nicht einfach im Speicher verschoben werden dürfen.</p>
</blockquote>
<p>Laut deiner Signatur hast du schon mal von std::vector gehört. Fragen über Fragen ... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> <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/2196469</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2196469</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Thu, 29 Mar 2012 06:56:34 GMT</pubDate></item><item><title><![CDATA[Reply to Warum on Thu, 29 Mar 2012 09:03:57 GMT]]></title><description><![CDATA[<p>warum123456 schrieb:</p>
<blockquote>
<p>Warum hat sich das C++ Komitee dagegen entschieden ein realloc Äquivalent zu [bieten]?</p>
</blockquote>
<p>Wahrscheinlich, weil's der Aufwand nicht wert wäre. Also, new[] und delete[] sind ja eh schon fast sinnfrei, weil wir std::vector haben. Und std::vector arbeitet mit Allokatoren (allocate, deallocate, construct, destroy, ...).</p>
<p>Ich würde auch behaupten, dass der C++ Standard es einer std::vector-Implementierung nicht verbietet, im Falle des Standard-Allocators etwas &quot;schlauer&quot; zu sein. Beispielsweise kann ich mir eine Implementierung vorstellen, die im Falle von PODs tatsächlich auf realloc zurückgreift. Im Falle von non-PODs bräuchte man noch so etwas wie ein try_realloc, wie schon genannt, weil man diese Objekte nicht per memcpy verschieben kann. Wenn der Speicherblock nicht vergrößert werden kann und ein neuer her muss, müssen die Elemente einfach Objekt für Objekt per Kopierkonstruktor oder Movekonstruktor (falls T &quot;noexcept movable&quot; ist) im neuen Speicherblock konstruiert werden und im alten wieder zerstört werden.</p>
<p>Das sind Dinge, die man als Hersteller einfach so als QoI-Feature einbauen könnte, ohne dass man da im Standard weiter darauf eingehen muss. Du kannst Dich ja mal dafür beim Hersteller Deines Vertrauens einsetzen. <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/2196513</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2196513</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 29 Mar 2012 09:03:57 GMT</pubDate></item><item><title><![CDATA[Reply to Warum on Thu, 29 Mar 2012 13:14:08 GMT]]></title><description><![CDATA[<p>Ich muss jetzt mal ganzdumm fragen... Warum sollte man Non-PODs nicht mit memcpy oder realloc verschieben können?</p>
<p>Der einzige Grund, der mir einfällt wäre hier, dass die Objekte nach dem realloc nicht mehr so im Speicher &quot;aligned&quot; sind, wie der Compiler das eigentlich geplant hatte.</p>
<p>Abgesehen vom Alignment sollte das hier z.B. locker klappen:</p>
<pre><code class="language-cpp">#include &lt;string&gt;

std::string * strs = static_cast&lt;std::string *&gt;(malloc(sizeof(std::string) * 10));
for (int n = 0; n &lt; 10; ++n)
    new (&amp;strs[n]) std::string();

// Vergrößern
strs = static_cast&lt;std::string *&gt;(realloc(static_cast&lt;void*&gt;(strs), sizeof(std::string) * 15));
for (int n = 10; n &lt; 15; ++n)
    new (&amp;strs[n]) std::string();

// Verkleinern
for (int n = 12; n &lt; 15; ++n)
    strs[n].~string(); // ka, ob das die korrekte Syntax ist... sowas packe ich normalerweise in einer Templatefunktion, da klappt das :-)
strs = static_cast&lt;std::string *&gt;(realloc(static_cast&lt;void*&gt;(strs), sizeof(std::string) * 12));

// Freigeben
for (int n = 0; n &lt; 12; ++n)
    strs[n].~string(); // selbes wie oben
free(strs);

// Man muss bei der ganzen Sache eben irgendwo speichern, wie viele Instanzen des Non-PODs man hat und man muss manuell Konstruktoren und Destruktoren aufrufen.
</code></pre>
<p>Abgesehen vom Alignment sind Non-PODs auch nur eine Reihe von Bytes, die man im Speicher rumschieben kann. So lange Konstruktoren und Destruktoren immer mit dem aktuellen this-Zeiger versorgt werden, sollte es da keine Probleme geben.<br />
ich kann natürlich kein memcpy mit std::string machen und dann beide freigeben, da ja beide den gleichen Zeiger intern speichern. Aber das sollte ja klar sein <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>Sollte ich völlig falsch liegen, würde ich mich mal über Aufklärung freuen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2196599</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2196599</guid><dc:creator><![CDATA[DrakoXP]]></dc:creator><pubDate>Thu, 29 Mar 2012 13:14:08 GMT</pubDate></item><item><title><![CDATA[Reply to Warum on Thu, 29 Mar 2012 13:24:53 GMT]]></title><description><![CDATA[<p>krümelkacker<br />
Warum sollte man die Objekte nicht im Speicher verschieben können? Und seit wann macht std::vector etwas anderes wenn er neu reservieren muss?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2196605</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2196605</guid><dc:creator><![CDATA[warum123456]]></dc:creator><pubDate>Thu, 29 Mar 2012 13:24:53 GMT</pubDate></item><item><title><![CDATA[Reply to Warum on Thu, 29 Mar 2012 13:25:40 GMT]]></title><description><![CDATA[<p>Falsch. Du denkst viel zu restriktiv, was non-POD alles bedeuten kann. Selbst für den relativ einfach gestrickten std::string bringst du in deinem eigenem Beitrag allerlei Einschränkungen und Sachen auf die man aufpassen muss. Wie soll das bei ganz allgemeinen Non-PODs funktionieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2196606</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2196606</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 29 Mar 2012 13:25:40 GMT</pubDate></item><item><title><![CDATA[Reply to Warum on Thu, 29 Mar 2012 13:36:40 GMT]]></title><description><![CDATA[<p>DrakoXP schrieb:</p>
<blockquote>
<p>Der einzige Grund, der mir einfällt wäre hier, dass die Objekte nach dem realloc nicht mehr so im Speicher &quot;aligned&quot; sind, wie der Compiler das eigentlich geplant hatte.</p>
</blockquote>
<p>Interne Zeiger.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2196609</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2196609</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Thu, 29 Mar 2012 13:36:40 GMT</pubDate></item><item><title><![CDATA[Reply to Warum on Thu, 29 Mar 2012 13:51:51 GMT]]></title><description><![CDATA[<p>DrakoXP schrieb:</p>
<blockquote>
<p>Ich muss jetzt mal ganzdumm fragen... Warum sollte man Non-PODs nicht mit memcpy oder realloc verschieben können?</p>
</blockquote>
<p>Weil es im Allgemeinen keine einfachen Datensammlungen mehr sind, sondern Objekte, die selbst wissen wollen, wann &amp; wo sie erzeugt und zerstört werden. Beispielsweise könnte ich eine Klasse bauen, deren Objekte sich mit ihrem this-Zeiger irgendwo registrieren, so lange sie leben. Das würdest Du damit völlig kaputt machen.</p>
<p>DrakoXP schrieb:</p>
<blockquote>
<p>Abgesehen vom Alignment sind Non-PODs auch nur eine Reihe von Bytes, die man im Speicher rumschieben kann.</p>
</blockquote>
<p>Nö!</p>
<p>Probier das mal beispielsweise bei linked_ptr&lt;&gt;, wo sich Objekt-Kopien selbst in eine verkettete Liste einreihen. Das geht gehörig schief.</p>
<p>Sicher gibt es auch non-POD-Klassen, die man prinzipiell per memcpy &quot;moven&quot; könnte, ohne dass etwas schief läuft. Aber verlassen kannst Du Dich da nicht drauf, dass ein bestimmter Typ T das erlaubt.</p>
<p>warum123456 schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24868">@krümelkacker</a>:<br />
Warum sollte man die Objekte nicht im Speicher verschieben können?</p>
</blockquote>
<p>Habe ich glaub'ich inzwischen beantwortet.</p>
<p>warum123456 schrieb:</p>
<blockquote>
<p>Und seit wann macht std::vector etwas anderes wenn er neu reservieren muss?</p>
</blockquote>
<p>std::vector verwendet kein memcpy/realloc, um den Kram zu &quot;verschieben&quot;, sondern geht über den Kopierkonstruktor bzw Movekonstruktor des Elementtyps und zerstört ordnungsgemäß die Objekte, die im alten Speicherblock lebten. Zumindest bei non-PODs.</p>
<p>Wie gesagt, ich kann mir vorstellen, dass ein Compilerhersteller für vector&lt;T&gt; mit T als POD eine Spezialisierung baut, die im Endeffekt realloc verwendet. Für non-PODs ist realloc zu brutal, weil es den Kram kopiert und den alten Speicher zu früh freigibt, ohne dass man die Gelegenheit bekommt, die Objekte per Copy-Ctor bzw Move-Ctor umziehen zu lassen und die alten danach noch zu destruieren. Der Speicher ist ja schon futsch dann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2196614</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2196614</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 29 Mar 2012 13:51:51 GMT</pubDate></item><item><title><![CDATA[Reply to Warum on Thu, 29 Mar 2012 13:42:58 GMT]]></title><description><![CDATA[<p>Bashar schrieb:</p>
<blockquote>
<p>DrakoXP schrieb:</p>
<blockquote>
<p>Der einzige Grund, der mir einfällt wäre hier, dass die Objekte nach dem realloc nicht mehr so im Speicher &quot;aligned&quot; sind, wie der Compiler das eigentlich geplant hatte.</p>
</blockquote>
<p>Interne Zeiger.</p>
</blockquote>
<p>Die werden ja im Beispiel(!) durchs placement-new durchaus befriedigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2196615</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2196615</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Thu, 29 Mar 2012 13:42:58 GMT</pubDate></item><item><title><![CDATA[Reply to Warum on Thu, 29 Mar 2012 13:58:59 GMT]]></title><description><![CDATA[<p>So ein &quot;renew&quot; könnte doch die move Konstruktoren nutzen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2196631</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2196631</guid><dc:creator><![CDATA[warum123456]]></dc:creator><pubDate>Thu, 29 Mar 2012 13:58:59 GMT</pubDate></item><item><title><![CDATA[Reply to Warum on Thu, 29 Mar 2012 14:19:21 GMT]]></title><description><![CDATA[<p>warum123456 schrieb:</p>
<blockquote>
<p>So ein &quot;renew&quot; könnte doch die move Konstruktoren nutzen?</p>
</blockquote>
<p>Du brauchst nur eine Art &quot;try_realloc&quot;, was den Speicherblock zu vergrößern versucht aber nichts macht, wenn es nicht klappt. Den Rest kannst Du dann in der std::vector&lt;T&gt; Implementierung lösen, ohne dass man am C++ Standard etwas ändern muss.</p>
<p>Wie gesagt, new[] &amp; delete[] ist quasi für'n 4rsch. Ich sehe absolut keinen Sinn darin, ein renew[] mit in die Sprache aufzunehmen. Aber du kannst es ja vorschlagen, wenn Du es haben willst. Mir persönlich fallen da andere Dinge ein, die wichtiger sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2196645</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2196645</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 29 Mar 2012 14:19:21 GMT</pubDate></item></channel></rss>