<?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[Frage zu C++ Primer Übung 4.29 (Zeichenstrings im C-Stil)]]></title><description><![CDATA[<p>Hallo!<br />
Ich lerne gerade C++ mit dem C++ Primer (Vierte Auflage). Dabei bin ich auf eine Übung gestoßen, die ich nicht ganz verstehe (S. 176, 4.29 b), Kapitel &quot;Zeichenstrings im C-Stil&quot;):</p>
<pre><code>Betrachten Sie die beiden Programmfragmente.

Im Mittel wird die Implementierung mit der Klasse string erheblich schneller
ausgeführt als die Funktionen mit den Strings im C-Stil. Die jeweilige
durchschnittliche Laufzeit sieht auf unserem üner fünf Jahre alten PC
folgendermaßen aus:

    user    0.47    # stringklasse
    user    2.55    # Zeichenstring im C-Stil

Haben Sie das erwartet? Wie erklären Sie es?
</code></pre>
<p>Hier die beiden Programmfragmente:</p>
<pre><code class="language-cpp">/*Die folgenden Programm verdeutlichen die Unterschiede zwscihen Zeichenstrings
  im C-Stil und dem Typ string aus der C++-Bibliothek. Die Version mit der
  Klasse string ist kürzer, leicher verständlich und weniger fehleranfällig:*/

//  Implementierung von Zeichenstrings im C-Stil
    const char *pc = &quot;a very long literal string&quot;;
    const size_t len = strlen(pc +1); // Speicherplatz
    // Geschwindigkeitstest beim Zuweisen und Kopieren von Strings
    for (size_t ix = 0; ix != 1000000 ; ++ix)  {
        char *pc2 = new char[len + 1]; // Weist Speicherplatz zu

        strcpy(pc2, pc);    // Erledigt das Kopieren
        if(strcmp(pc2, pc)) // Verwendet den neuen String
            ; // Macht nichts
        delete [] pc2;      // Gibt den Speicher frei
    }
//  string-Implementation
    string str(&quot;a very long literal string&quot;);
    // Geschwindigkeitstest beim Zuweisen und Kopieren von Strings
    for (size_t ix = 0; ix != 1000000 ; ++ix)  {
        string str2 = str; // Erledigt die Kopie, Zuweisung erfolgt automatisch
        if(str != str2)    // Verwendet den neuen Striing
            ; // Macht nichts
    } //str2 wird automatisch freigegeben
</code></pre>
<p>Wieso ist die std::string Implementation so viel schneller als die mit den C-Strings? Ich dachte immer, std::string sei nur ein (sicherer) Verwaltungscontainer für C-Strings. Dann müsste std::string ja auch die selben Funktionen nutzen wie bei der C-String Implementation.<br />
Bei welchem Schritt verliert die C-String Implementation so viel Zeit?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/237382/frage-zu-c-primer-übung-4-29-zeichenstrings-im-c-stil</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 11:08:58 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/237382.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 28 Mar 2009 01:02:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu C++ Primer Übung 4.29 (Zeichenstrings im C-Stil) on Sat, 28 Mar 2009 01:02:02 GMT]]></title><description><![CDATA[<p>Hallo!<br />
Ich lerne gerade C++ mit dem C++ Primer (Vierte Auflage). Dabei bin ich auf eine Übung gestoßen, die ich nicht ganz verstehe (S. 176, 4.29 b), Kapitel &quot;Zeichenstrings im C-Stil&quot;):</p>
<pre><code>Betrachten Sie die beiden Programmfragmente.

Im Mittel wird die Implementierung mit der Klasse string erheblich schneller
ausgeführt als die Funktionen mit den Strings im C-Stil. Die jeweilige
durchschnittliche Laufzeit sieht auf unserem üner fünf Jahre alten PC
folgendermaßen aus:

    user    0.47    # stringklasse
    user    2.55    # Zeichenstring im C-Stil

Haben Sie das erwartet? Wie erklären Sie es?
</code></pre>
<p>Hier die beiden Programmfragmente:</p>
<pre><code class="language-cpp">/*Die folgenden Programm verdeutlichen die Unterschiede zwscihen Zeichenstrings
  im C-Stil und dem Typ string aus der C++-Bibliothek. Die Version mit der
  Klasse string ist kürzer, leicher verständlich und weniger fehleranfällig:*/

//  Implementierung von Zeichenstrings im C-Stil
    const char *pc = &quot;a very long literal string&quot;;
    const size_t len = strlen(pc +1); // Speicherplatz
    // Geschwindigkeitstest beim Zuweisen und Kopieren von Strings
    for (size_t ix = 0; ix != 1000000 ; ++ix)  {
        char *pc2 = new char[len + 1]; // Weist Speicherplatz zu

        strcpy(pc2, pc);    // Erledigt das Kopieren
        if(strcmp(pc2, pc)) // Verwendet den neuen String
            ; // Macht nichts
        delete [] pc2;      // Gibt den Speicher frei
    }
//  string-Implementation
    string str(&quot;a very long literal string&quot;);
    // Geschwindigkeitstest beim Zuweisen und Kopieren von Strings
    for (size_t ix = 0; ix != 1000000 ; ++ix)  {
        string str2 = str; // Erledigt die Kopie, Zuweisung erfolgt automatisch
        if(str != str2)    // Verwendet den neuen Striing
            ; // Macht nichts
    } //str2 wird automatisch freigegeben
</code></pre>
<p>Wieso ist die std::string Implementation so viel schneller als die mit den C-Strings? Ich dachte immer, std::string sei nur ein (sicherer) Verwaltungscontainer für C-Strings. Dann müsste std::string ja auch die selben Funktionen nutzen wie bei der C-String Implementation.<br />
Bei welchem Schritt verliert die C-String Implementation so viel Zeit?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1687206</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1687206</guid><dc:creator><![CDATA[C++Primer]]></dc:creator><pubDate>Sat, 28 Mar 2009 01:02:02 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu C++ Primer Übung 4.29 (Zeichenstrings im C-Stil) on Sat, 28 Mar 2009 01:11:31 GMT]]></title><description><![CDATA[<p>wegen copy on write</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1687209</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1687209</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 28 Mar 2009 01:11:31 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu C++ Primer Übung 4.29 (Zeichenstrings im C-Stil) on Sat, 28 Mar 2009 01:24:29 GMT]]></title><description><![CDATA[<p>Danke für die Antwort. Nur habe ich leider keine Ahnung was du meinst <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1687212</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1687212</guid><dc:creator><![CDATA[C++Primer]]></dc:creator><pubDate>Sat, 28 Mar 2009 01:24:29 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu C++ Primer Übung 4.29 (Zeichenstrings im C-Stil) on Sat, 28 Mar 2009 02:22:48 GMT]]></title><description><![CDATA[<p>strcpy muss jedes zeichen einzeln kopieren und jedes mal nachprüfen, ob das zeichen jz schon das letzte (also '\0') ist. das kopieren eines strings hab ich jetzt nicht finden können - vll will das noch wer anders machen ^^<br />
aber es wird mit sicherheit mithilfe der länge bewerkstelligt sein und somit entfällt dieses ständige prüfen auf '\0'.</p>
<p>der operator == von string führt das compare aus der string-klasse aus - der ruft wieder traits &lt;value_type&gt;::compare auf - und das sieht so hier aus (zumindest in der stl des MSVC):</p>
<pre><code class="language-cpp">int compare(const _Elem *_First1, const _Elem *_First2, size_t _Count)
{	// compare [_First1, _First1 + _Count) with [_First2, ...)
	for (; 0 &lt; _Count; --_Count, ++_First1, ++_First2)
		if (!eq(*_First1, *_First2))
			return (lt(*_First1, *_First2) ? -1 : +1);
	return (0);
}
</code></pre>
<p>also muss auch hier nicht jedes mal wieder ein abgleich der aktuellen speicherposition mit '\0' gemacht werden, sondern es existiert gleich ein laufindex mit der länge...</p>
<p>also:</p>
<ul>
<li>vergleich ist schneller</li>
<li>das kopieren ist schnller</li>
<li>allokation und deallokation wird sich nichts nehmen</li>
</ul>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1687216</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1687216</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sat, 28 Mar 2009 02:22:48 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu C++ Primer Übung 4.29 (Zeichenstrings im C-Stil) on Sat, 28 Mar 2009 02:20:33 GMT]]></title><description><![CDATA[<p>Das macht Sinn. Jetzt hab ichs verstanden. Danke! <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/1687217</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1687217</guid><dc:creator><![CDATA[C++Primer]]></dc:creator><pubDate>Sat, 28 Mar 2009 02:20:33 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu C++ Primer Übung 4.29 (Zeichenstrings im C-Stil) on Sat, 28 Mar 2009 02:25:44 GMT]]></title><description><![CDATA[<p>C++Primer schrieb:</p>
<blockquote>
<p>Das macht Sinn. Jetzt hab ichs verstanden. Danke! <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>
</blockquote>
<p>np ^^<br />
hast du gesehen, dass ichs noch ma geändert habe? die sätze waren teilweise so grässlich geschrieben - war mir dann zu peinlich, dass das jemand liest und sich dann drüber lustig macht <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=";D"
      alt="😉"
    /> und als ichs dann einmal geändert habe, hab ich dann auch nochmal die hälfte geändert (in der hoffnung, dass es noch besser ist, als es davor schon war ^^)</p>
<p>außerdem musste ich noch was schreiben, damit ich 1111 beiträge habe ;o)</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1687218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1687218</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sat, 28 Mar 2009 02:25:44 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu C++ Primer Übung 4.29 (Zeichenstrings im C-Stil) on Sat, 28 Mar 2009 03:03:59 GMT]]></title><description><![CDATA[<p>die paar gesparten vergleiche bringens aber nicht. schauen wir doch mal, wie kopiert wird...</p>
<pre><code class="language-cpp">basic_string&amp;
      operator=(const basic_string&amp; __str) 
      { return this-&gt;assign(__str); }
</code></pre>
<p>naja, also assign suchen.</p>
<pre><code class="language-cpp">template&lt;typename _CharT, typename _Traits, typename _Alloc&gt;
    basic_string&lt;_CharT, _Traits, _Alloc&gt;&amp;
    basic_string&lt;_CharT, _Traits, _Alloc&gt;::
    assign(const basic_string&amp; __str)
    {
      if (_M_rep() != __str._M_rep())
	{
	  // XXX MT
	  const allocator_type __a = this-&gt;get_allocator();
	  _CharT* __tmp = __str._M_rep()-&gt;_M_grab(__a, __str.get_allocator());
	  _M_rep()-&gt;_M_dispose(__a);
	  _M_data(__tmp);
	}
      return *this;
    }
</code></pre>
<p>aha? anscheinen besorgt _M_grab das kopieren.</p>
<pre><code class="language-cpp">_CharT*
	_M_grab(const _Alloc&amp; __alloc1, const _Alloc&amp; __alloc2)
	{
	  return (!_M_is_leaked() &amp;&amp; __alloc1 == __alloc2)
	          ? _M_refcopy() : _M_clone(__alloc1);
	}
</code></pre>
<p>hier ist _M_refcopy interessant</p>
<pre><code class="language-cpp">_CharT*
	_M_refcopy() throw()
	{
#ifndef _GLIBCXX_FULLY_DYNAMIC_STRING
	  if (__builtin_expect(this != &amp;_S_empty_rep(), false))
#endif
            __gnu_cxx::__atomic_add_dispatch(&amp;this-&gt;_M_refcount, 1);
	  return _M_refdata();
	}  // XXX MT
</code></pre>
<p>da passiert nicht mehr als _M_refcount+=1</p>
<p>also es wird gar nix kopiert. beide string-objekte zeigen nach</p>
<pre><code class="language-cpp">string str2 = str;
</code></pre>
<p>auf den selben speicher und teilen sich den.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1687222</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1687222</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 28 Mar 2009 03:03:59 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu C++ Primer Übung 4.29 (Zeichenstrings im C-Stil) on Sat, 28 Mar 2009 03:57:42 GMT]]></title><description><![CDATA[<p>hmm.. hab ich noch nich gewusst - und im msvc seh ich da auch nicht durch -.-<br />
wenn du mal lange weile hast, kannste das ja da auch mal zeigen!? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>wobei mir das gerade sehr komisch vorkommt, weil dann ja jedes mal ne fallunterscheidung gemacht werden muss (op+=, dtor, ...) - also ob man dann jz kopieren(aufräumen) muss oder ob man schon nen eigenen speicherbereich hat...<br />
haste lust, das zu erklären? : &gt;</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1687225</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1687225</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sat, 28 Mar 2009 03:57:42 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu C++ Primer Übung 4.29 (Zeichenstrings im C-Stil) on Sat, 28 Mar 2009 08:22:30 GMT]]></title><description><![CDATA[<p>MSVC 6 hat AFAIK noch eine STL dabei die COW für std::string verwendet.<br />
MSVC 7.1 und 8 haben &quot;normale&quot; std::string Implementierungen, die lediglich die SSO verwenden (small string optimization).</p>
<p>COW für std::string zu implementieren ist kaum sinnvoll möglich. In single-threaded Applikationen würde es in einigen wenigen Fällen etwas bringen. Im multi-threading Applikationen müsste man für den Referenz-Zähler CAS bzw. InterlockedIncrement/InterlockedDecrement verwenden, was einiges kostet. Idealerweise wäre malloc schonmal schneller als ein einziger CAS/InterlockedXxx Aufruf. Wäre deswegen, weil malloc auf Windows/MSVC ziemlich langsam ist - IIRC ca. 2,5 mal langsamer als CAS (auf heutiger Standard-Hardware mit Intel CPU -- AMD hab' ich nie gemessen).</p>
<p>2,5 mal klingt jetzt als ob man damit noch gut was rausholen könnte. Ist aber nicht so. Warum? Weil COW bei std::string eben nahezu unbrauchbar ist. So ziemlich das einzige wo bei einem geCOWten std::string nicht kopiert werden muss, ist den String 1:1 durchzureichen, oder maximal noch size() aufzurufen. Sobald man den String aber z.B. über eine mutable Referenz ausliest, muss kopiert werden. Klingt komisch, is aber so. Grund: die String Klasse kann nicht wissen, dass diverse Zugriffe, die eine mutable Referenz auf die im String gespeicherten chars zurückliefern, nicht wirklich verwendet werden um den String zu manipulieren.</p>
<p>Beispiel:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;

int main()
{
    std::string s1 = &quot;seppdepp&quot;;
    std::string s2 = s1; // COW?

    char c = s1[5]; // liest bloss, sieht harmlos aus
    char&amp; ref = s1[5]; // hmmm...
    ref = 'X'; // HMMMMM...

    std::cout &lt;&lt; &quot;s1=&quot; &lt;&lt; s1 &lt;&lt; &quot;\n&quot;;
    std::cout &lt;&lt; &quot;s2=&quot; &lt;&lt; s2 &lt;&lt; &quot;\n&quot;;
}
</code></pre>
<p>std::string kann hier nicht unterscheiden ob der operator [] aufgerufen wird um den String auszulesen, oder um ihn zu verändern. Dasselbe Problem hat man beim Dereferenzieren von Iteratoren. Kurz: bei fast jeder Operation muss der String kopiert werden, um sicherzustellen, dass <em>andere</em> Strings nicht &quot;unabsichtlich&quot; geändert werden könnten.</p>
<p>Zurück zum Thema &quot;ist aber nicht so&quot;. COW bringt nix, weil fast jeder String, der über COW &quot;geshared&quot; wird, gleich wieder kopiert werden muss. Wenn man für das &quot;sharen&quot; und &quot;un-sharen&quot; fast nix zahlt, wie eben bei single-threaded Applikationen, kann es trotzdem was bringen, und kaum schaden. Wenn man aber für das sharen &amp; un-sharen ca. 40% des kopierens/freigebens zahlt, dann bringt es eben nixmehr. Bzw. macht die Sache sogar langsamer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1687242</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1687242</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 28 Mar 2009 08:22:30 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu C++ Primer Übung 4.29 (Zeichenstrings im C-Stil) on Sat, 28 Mar 2009 09:28:03 GMT]]></title><description><![CDATA[<p>noch einfacher: in normalen anwendungen wird jeder kopierte string auch verändert, denn nur dazu hat man ihn kopiert. also bringt copy-on-write nix.</p>
<p>was ist CAS?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1687263</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1687263</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 28 Mar 2009 09:28:03 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu C++ Primer Übung 4.29 (Zeichenstrings im C-Stil) on Sat, 28 Mar 2009 16:55:04 GMT]]></title><description><![CDATA[<p>CAS = compare and swap = InterlockedCompareExchange</p>
<blockquote>
<p>noch einfacher: in normalen anwendungen wird jeder kopierte string auch verändert, denn nur dazu hat man ihn kopiert. also bringt copy-on-write nix.</p>
</blockquote>
<p>Das würde ich so nicht sagen. An wirklich vielen Stellen werden Strings nur rumgereicht und gelesen. Oft sogar nur durchgereicht. Als Parameter gehts ja noch mit cosnt&amp;, aber doof sind u.a. Returnwerte.</p>
<p>Das Problem ist wirklich nur, dass das Lesen bei std::string auch dazu führt dass die Kuh kopiert werden muss.</p>
<p>Der neue Standard wird dank move-semantics da an vielen Stellen helfen.</p>
<p>Ich wünsche mir aber trotzdem std::const_string <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/1687535</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1687535</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 28 Mar 2009 16:55:04 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu C++ Primer Übung 4.29 (Zeichenstrings im C-Stil) on Sat, 28 Mar 2009 18:32:24 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Ich wünsche mir aber trotzdem std::const_string <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>
</blockquote>
<p>Sowas wie der einmal von Shade of Mine vorgeschlagene NonCopy-String?</p>
<p>Ist wahrscheinlich nicht allzu schwierig, sowas zu implementieren... Aber wenns grad im Standard wäre, wäre das natürlich nichts schlecht. <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/1687584</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1687584</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 28 Mar 2009 18:32:24 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu C++ Primer Übung 4.29 (Zeichenstrings im C-Stil) on Sun, 29 Mar 2009 08:15:58 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Ich wünsche mir aber trotzdem std::const_string <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>
</blockquote>
<p>Sowas wie der einmal von Shade of Mine vorgeschlagene NonCopy-String?</p>
</blockquote>
<p>Nö, ein sehrwohl-copy String der aber einfach immutable ist. Der könnte dann nämlich sharen soviel er mag.</p>
<blockquote>
<p>Ist wahrscheinlich nicht allzu schwierig, sowas zu implementieren... Aber wenns grad im Standard wäre, wäre das natürlich nichts schlecht. <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>
</blockquote>
<p>Jo, solange es nicht in Standard ist ists ziemlich zwecklos.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1687710</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1687710</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 29 Mar 2009 08:15:58 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu C++ Primer Übung 4.29 (Zeichenstrings im C-Stil) on Sun, 29 Mar 2009 10:48:15 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Nexus schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Ich wünsche mir aber trotzdem std::const_string <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>
</blockquote>
<p>Sowas wie der einmal von Shade of Mine vorgeschlagene NonCopy-String?</p>
</blockquote>
<p>Nö, ein sehrwohl-copy String der aber einfach immutable ist. Der könnte dann nämlich sharen soviel er mag.</p>
</blockquote>
<p>reicht es da nicht einfach schon,</p>
<pre><code class="language-cpp">const string appName(string(&quot;foo&quot;)+bar);
</code></pre>
<p>zu schreiben.<br />
der kluge bibliotheksentwickler hat doch sicherlich dran gedacht, daß die</p>
<pre><code class="language-cpp">char&amp; operator[](size_t index)
</code></pre>
<p>eine kopie erzeugt, aber die</p>
<pre><code class="language-cpp">char const&amp; operator[](size_t index) const
</code></pre>
<p>sowas nicht macht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1687747</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1687747</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 29 Mar 2009 10:48:15 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu C++ Primer Übung 4.29 (Zeichenstrings im C-Stil) on Sun, 29 Mar 2009 12:05:37 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Nö, ein sehrwohl-copy String der aber einfach immutable ist. Der könnte dann nämlich sharen soviel er mag.</p>
</blockquote>
<p>Aber käme man da nicht bereits mit <code>const char*</code> relativ weit? Vielleicht noch leicht gewrappt, dass man sich nicht mehr um die Speicherverwaltung kümmern muss...</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Jo, solange es nicht in Standard ist ists ziemlich zwecklos.</p>
</blockquote>
<p>Ja, es ist dann eben nicht &quot;anerkannt&quot; und die Verbreitung würde sich im Mass halten. Aber innerhalb der eigenen Projekte spricht ja nichts dagegen, sich zusätzliche Utility-Klassen zu basteln...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1687766</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1687766</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 29 Mar 2009 12:05:37 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu C++ Primer Übung 4.29 (Zeichenstrings im C-Stil) on Sun, 29 Mar 2009 12:16:33 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Nö, ein sehrwohl-copy String der aber einfach immutable ist. Der könnte dann nämlich sharen soviel er mag.</p>
</blockquote>
<p>Aber käme man da nicht bereits mit <code>const char*</code> relativ weit? Vielleicht noch leicht gewrappt, dass man sich nicht mehr um die Speicherverwaltung kümmern muss...</p>
</blockquote>
<p>ja, wrapper, referenzzähler rund innendrin ein char const*, voila, ein const_string.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1687768</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1687768</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 29 Mar 2009 12:16:33 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu C++ Primer Übung 4.29 (Zeichenstrings im C-Stil) on Sun, 29 Mar 2009 12:38:31 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>ja, wrapper, referenzzähler rund innendrin ein char const*, voila, ein const_string.</p>
</blockquote>
<p><code>boost::shared_array&lt;const char&gt;</code> ? <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/1687774</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1687774</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 29 Mar 2009 12:38:31 GMT</pubDate></item></channel></rss>