<?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 Optimierungen]]></title><description><![CDATA[<p>Hi, ich lese immer wieder, dass die stdlibc++ sehr gut optimiert ist. Aus Interesse habe ich dann auch mal in den Quelltext von std::string bzw. std::basic_string geschaut. Aber ehrlicherweise muss ich sagen, dass ich da nicht ganz durchblicke. Was ich aber meine rausgelesen zu haben ist, dass mehrere std::string auf den gleichen String im Speicher zeigen können und dies mit ref-counts gehandhabt wird. Ist das richtig oder lese ich da Sachenr ein, die gar nicht da sind.</p>
<p>Gruß Peter</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/289339/std-string-optimierungen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 19 Aug 2026 05:44:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/289339.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 02 Jul 2011 18:40:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::string Optimierungen on Sat, 02 Jul 2011 18:40:28 GMT]]></title><description><![CDATA[<p>Hi, ich lese immer wieder, dass die stdlibc++ sehr gut optimiert ist. Aus Interesse habe ich dann auch mal in den Quelltext von std::string bzw. std::basic_string geschaut. Aber ehrlicherweise muss ich sagen, dass ich da nicht ganz durchblicke. Was ich aber meine rausgelesen zu haben ist, dass mehrere std::string auf den gleichen String im Speicher zeigen können und dies mit ref-counts gehandhabt wird. Ist das richtig oder lese ich da Sachenr ein, die gar nicht da sind.</p>
<p>Gruß Peter</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2087865</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2087865</guid><dc:creator><![CDATA[Peterblub]]></dc:creator><pubDate>Sat, 02 Jul 2011 18:40:28 GMT</pubDate></item><item><title><![CDATA[Reply to std::string Optimierungen on Sat, 02 Jul 2011 18:43:14 GMT]]></title><description><![CDATA[<p>Es ist möglich und Bjarne Stroustrup deutete es auch an.</p>
<p>EDIT: Es ist aber nicht vorgeschrieben. Jede Implementierung der STD muss den Standard erfüllen, der Rest ist egal. Und wie das intern mit dem Kopieren handgehabt wird ist ausserhalb des Bereichs des Standards.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2087866</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2087866</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Sat, 02 Jul 2011 18:43:14 GMT</pubDate></item><item><title><![CDATA[Reply to std::string Optimierungen on Sat, 02 Jul 2011 18:44:17 GMT]]></title><description><![CDATA[<p>Wie genau die STL-Klassen aufgebaut sind, ist Angelegenheit der Compiler-Entwicklers. Und Referenzzählung und Copy-on-Write Semantik ist durchaus konform zum ANSI-Standard (d.h. die Strings kopieren die dahinterliegenden Daten erst, wenn du ihre Daten änderst).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2087868</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2087868</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 02 Jul 2011 18:44:17 GMT</pubDate></item><item><title><![CDATA[Reply to std::string Optimierungen on Sat, 02 Jul 2011 18:44:28 GMT]]></title><description><![CDATA[<p>Herb Sutter schrieb:</p>
<blockquote>
<p><a href="http://www.gotw.ca/publications/optimizations.htm" rel="nofollow">Optimizations That Aren't (In a Multithreaded World)</a></p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2087869</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2087869</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 02 Jul 2011 18:44:28 GMT</pubDate></item><item><title><![CDATA[Reply to std::string Optimierungen on Sun, 03 Jul 2011 10:08:50 GMT]]></title><description><![CDATA[<p>Peterblub schrieb:</p>
<blockquote>
<p>Was ich aber meine rausgelesen zu haben ist, dass mehrere std::string auf den gleichen String im Speicher zeigen können und dies mit ref-counts gehandhabt wird. Ist das richtig [...?]</p>
</blockquote>
<p>Ja, das ist richtig. Ich hatte mir das auch mal angeguckt, als ich einen Programmcode sah, der per reinterpret_cast aus einem string* ein char** gemacht hatte. Ich war nämlich ganz schön überrascht, dass das Programm überhaupt funktionierte.</p>
<p>Im Moment sieht die std::string Implementierung der libstdc++-Bibliothek so aus: sizeof(string) = sizeof(char*). Das einzige Datenelement der Klasse <em>ist</em> auch ein char-Zeiger, der auf eine Nullterminierte Char-Sequenz zeigt. Alles andere (Länge, Kapazität und Referenzzähler) steht direkt <em>vor</em> dieser Char-Sequenz im selben Speicherblock. Die genaue Reihenfolge der 3 Ints weiß ich aber nicht mehr. Das Prinzip war folgendes:</p>
<pre><code class="language-cpp">struct meta {
  int ref_count;
  int size;
  int capacity;
};

class string {
  ...
  char* ptr; // &lt;-- einizges Datenelement
  ...
  meta&amp; meta_() const
  { assert(ptr); return *(reinterpret_cast&lt;meta*&gt;(ptr)-1);}
  ...
public:
  ...
  string(string const&amp; s)
  : ptr(s.ptr)
  { if (ptr) atomic_increment(meta_().ref_count); }
  ...
  const char* c_str() const
  { return ptr; }
  ...
};
</code></pre>
<p>(Angaben ohne Gewähr)</p>
<p>Ich weiß nicht, wie viel Overhead der Synchronisierungsaufwand wirklich ist. Die libstdc++ Entwickler sind anscheinend zufrieden mit ihrer aktuellen Implementierung. Die ist, soweit ich weiß, &quot;lock-free&quot; aber genauso &quot;thread-safe&quot; wie eine normale Implementierung ohne COW. Da der Move-Konstruktor den Referenzzähler gar nicht anfassen muss, sollte zumindest der sehr effizient sein.</p>
<p>Microsoft dagegen macht ein string-Objekt 32 Byte groß, wenn ich mich richtig erinnere. Jedenfalls ohne COW, aber dafür mit SSO</p>
<p>COW = copy-on-write<br />
SSO = small string optimization</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2088038</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2088038</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 03 Jul 2011 10:08:50 GMT</pubDate></item></channel></rss>