<?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[std::string capacity und assign]]></title><description><![CDATA[<p>Hallo,</p>
<p>weiß jemand, wie sich std::string::assign bezüglich der capacity verhalten soll? Ich finde so spontan nichts im C++-Standard.</p>
<p>Also was muß laut Standard hier raus kommen:</p>
<pre><code class="language-cpp">std::string s;
s.reserve(512);
s.assign(&quot;Hallo&quot;);
std::cout &lt;&lt; s.capacity() &lt;&lt; std::endl;
</code></pre>
<p>Ich habe hier Compiler. Die eine gibt 512 aus und die andere 31. Ich halte die 31 für nicht Standard-Konform. Meiner Meinung Nach muss die Ausgabe auf jeden fall eine Zahl &gt;= 512 ausgeben. Sehe ich das richtig?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/217600/std-string-capacity-und-assign</link><generator>RSS for Node</generator><lastBuildDate>Sat, 10 Oct 2026 14:48:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/217600.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 09 Jul 2008 08:04:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::string capacity und assign on Wed, 09 Jul 2008 08:04:23 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>weiß jemand, wie sich std::string::assign bezüglich der capacity verhalten soll? Ich finde so spontan nichts im C++-Standard.</p>
<p>Also was muß laut Standard hier raus kommen:</p>
<pre><code class="language-cpp">std::string s;
s.reserve(512);
s.assign(&quot;Hallo&quot;);
std::cout &lt;&lt; s.capacity() &lt;&lt; std::endl;
</code></pre>
<p>Ich habe hier Compiler. Die eine gibt 512 aus und die andere 31. Ich halte die 31 für nicht Standard-Konform. Meiner Meinung Nach muss die Ausgabe auf jeden fall eine Zahl &gt;= 512 ausgeben. Sehe ich das richtig?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1543964</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1543964</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Wed, 09 Jul 2008 08:04:23 GMT</pubDate></item><item><title><![CDATA[Reply to std::string capacity und assign on Wed, 09 Jul 2008 08:34:42 GMT]]></title><description><![CDATA[<p>tntnet schrieb:</p>
<blockquote>
<p>Meiner Meinung Nach muss die Ausgabe auf jeden fall eine Zahl &gt;= 512 ausgeben. Sehe ich das richtig?</p>
</blockquote>
<p>Seh ich auch so. Steht allerdings nicht explizit im Standard, zumindest habe ich nichts dergleichen finden können. <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/1543976</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1543976</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Wed, 09 Jul 2008 08:34:42 GMT</pubDate></item><item><title><![CDATA[Reply to std::string capacity und assign on Wed, 09 Jul 2008 08:46:30 GMT]]></title><description><![CDATA[<p>capacity muß zumindest so groß sein, wie size. Ist in beiden Varianten schon mal gegeben.<br />
Laut Draft muß aber nach dem reserve das capacity gleich oder größer als das reserve-Argument sein. Würde sagen, 31 ist falsch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1543983</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1543983</guid><dc:creator><![CDATA[Strolch]]></dc:creator><pubDate>Wed, 09 Jul 2008 08:46:30 GMT</pubDate></item><item><title><![CDATA[Reply to std::string capacity und assign on Wed, 09 Jul 2008 08:53:31 GMT]]></title><description><![CDATA[<p>Dreh mal das <code>assign</code> und <code>capacity</code> um. Ich bin mir ziemlich sicher, dass dann beide 512 ausgeben werden.<br />
Wenn ich mich recht entsinne, dann gab es doch was, dass der string seine grösse laufend anpassen darf. Also falls weniger Speicher benötigt wird, als reserviert ist, dann darf der string seinen Speicher verkleinern.</p>
<p>Ist vielleicht nicht immer praktisch, aber das darf wohl jeder selber entscheiden, wie er das umsetzen will. Hat natürlich schon was, wenn du einen string mit 512 Bytes verwendest und danach nur ein &quot;Hallo&quot; zuweist. In einigen Fällen könnte das Speicherschonender sein. Aber naja, ist wohl ein Streitpunkt.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1543989</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1543989</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 09 Jul 2008 08:53:31 GMT</pubDate></item><item><title><![CDATA[Reply to std::string capacity und assign on Wed, 09 Jul 2008 09:18:19 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Dreh mal das <code>assign</code> und <code>capacity</code> um. Ich bin mir ziemlich sicher, dass dann beide 512 ausgeben werden.<br />
Wenn ich mich recht entsinne, dann gab es doch was, dass der string seine grösse laufend anpassen darf. Also falls weniger Speicher benötigt wird, als reserviert ist, dann darf der string seinen Speicher verkleinern.</p>
<p>Ist vielleicht nicht immer praktisch, aber das darf wohl jeder selber entscheiden, wie er das umsetzen will. Hat natürlich schon was, wenn du einen string mit 512 Bytes verwendest und danach nur ein &quot;Hallo&quot; zuweist. In einigen Fällen könnte das Speicherschonender sein. Aber naja, ist wohl ein Streitpunkt.</p>
<p>Grüssli</p>
</blockquote>
<p>Wenn ich nach dem <code>assign</code> ein <code>reserve(512)</code> aufrufe, erhalte ich eine capacity von 543. Das ist korrektes Verhalten, da reserve hier mindestens 512 bytes reserviert hat.</p>
<p>Zum Hinweis: Es geht hier um einen Codeausschnitt. Hier folgen natürlich noch weitere <code>append</code> -Aufrufe, die bei einer capacity von 31 unnötigerweise zusätzliche Allokationen auslösen, obwohl ich dem <code>std::string</code> mitgeteilt habe, dass der String grösser wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1544005</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1544005</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Wed, 09 Jul 2008 09:18:19 GMT</pubDate></item><item><title><![CDATA[Reply to std::string capacity und assign on Wed, 09 Jul 2008 09:39:05 GMT]]></title><description><![CDATA[<p>tntnet schrieb:</p>
<blockquote>
<p>Hier folgen natürlich noch weitere <code>append</code> -Aufrufe, die bei einer capacity von 31 unnötigerweise zusätzliche Allokationen auslösen,...</p>
</blockquote>
<p>Wäre hier nicht ein Stream besser geeignet?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1544022</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1544022</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Wed, 09 Jul 2008 09:39:05 GMT</pubDate></item><item><title><![CDATA[Reply to std::string capacity und assign on Wed, 09 Jul 2008 12:24:38 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<p>tntnet schrieb:</p>
<blockquote>
<p>Hier folgen natürlich noch weitere <code>append</code> -Aufrufe, die bei einer capacity von 31 unnötigerweise zusätzliche Allokationen auslösen,...</p>
</blockquote>
<p>Wäre hier nicht ein Stream besser geeignet?</p>
</blockquote>
<p>Nein. Am Stream würde man das mögliche Fehlverhalten beim std::string nicht sehen. Damit könnte ich meine Frage nicht erläutern <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1544191</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1544191</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Wed, 09 Jul 2008 12:24:38 GMT</pubDate></item><item><title><![CDATA[Reply to std::string capacity und assign on Wed, 09 Jul 2008 13:14:12 GMT]]></title><description><![CDATA[<p>tntnet schrieb:</p>
<blockquote>
<p>Nein. Am Stream würde man das mögliche Fehlverhalten beim std::string nicht sehen. Damit könnte ich meine Frage nicht erläutern <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>
</blockquote>
<p>Ich habe schon mal gesagt, dass es womöglich kein Fehlverhalten ist, weil du noch ein assign dazwischen hast. Mir ist nicht bekannt, dass die capacity erhalten bleiben muss, nach einem assign Aufruf. Zudem was bringt es dir, wenn du wüsstest, dass es ein Fehlverhalten ist?</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/14941">@asc</a>,<br />
Wenn er nur Strings verwendet und keine Konvertierungen durchführen will, dann rate ich von den Streams ab. Ich habe das Anhängen von Daten bei einem <code>stringstream</code> mit dem Anhängen von Daten bei einem <code>string</code> verglichen (Dinkumware), da war der normale <code>string</code> mit dem <code>operator +=</code> deutlich schneller und das ohne vorher ein capacity Aufruf durchzuführen!</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1544267</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1544267</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 09 Jul 2008 13:14:12 GMT</pubDate></item></channel></rss>