<?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[Strings versus TextArrays]]></title><description><![CDATA[<p>Guten Abend,</p>
<p>ich hätte da nun auch mal einige Fragen zu Strings und Char-Arrays.</p>
<p>1.Beispiel:</p>
<pre><code>const int GR = 10000;
char rohstring[GR]
file.getline(rohstring,GR);
</code></pre>
<p>So habe ich ja hier ja quasi einen Eingabepuffer mit fester Größe.</p>
<p>Nehme ich aber so etwas:</p>
<pre><code>std::string rohstring;
getline(file,rohstring)
</code></pre>
<p>Da habe ich ja nun einen String, der ja größendynamisch ist, also seine Größe je nach dem was man reinpackt dynamisch anpasst.</p>
<p>Wenn also nun in der Datei Zeilen mit 1000 bis 8000 Zeichen Länge sind, so ist die obere Variante ein wenig Speicherintensiver und eventuell sogar zu gross gewählt, während die string Variante ja immer den exakten Speicher für die aktuelle Zeile belegt.<br />
Aber leidet dann nicht auch ein wenig die Performance, was sich dann bei 70000 Zeilen vielleicht auch stark bemerkbar macht weil der String ja ständig in seiner Größe rauf und runter pendelt?<br />
Was sagen die Experten?</p>
<p>2.Beispiel:</p>
<pre><code>struct Buecher
{
char sku[10];
char stichwort[150];
char titel[350];
char utitel[350];
char autor[150];
char auflage[120];
char verlag[120];
char format[120];
char seiten[60];
char jahrT[20];
char einband[50];
char zustandT[350];
char zustandZ[30];
char gewichtT[10];
char dataender[25];
char daterstell[25];
char preisT[10];
char sprache[30];
char isbn[20];
char amakat[100];
char isbn13[20];
char intinfo[150];
char mengeT[5];
char sach1[300];
char exportT[10];
}buch[200000];
</code></pre>
<p>Hier ist eine ziemlich fette Struktur, die dazu dient, 200000 Buecher mit ihren Daten wie Titel, Verlag, Autor usw. aufzunehmen.<br />
(Mittlerweile arbeite ich mit einer Dateigepufferten Variante. Ich lese also nicht mehr alle Bücher ein, sondern hole mir immer den relevanten Datensatz aus der Datei) Aber mich würde trotzdem mal an dem Beispiel mit den 200000 Buchstrukturen interessieren inwie hier nun die String Variante besser ist.</p>
<pre><code>struct Buecher
{
std::string sku;
std::string stichwort;
std::string titel;
.
.
}buch[200000];
</code></pre>
<p>Im char Beispiel habe ich ja bei 200000 Datensätzen eine wahnsinnige Speicherverschwendung, weil ja alle Strukturelemente in der Größe festgesetzt sind und demnach kürzere Texte viel zu viel Platz im Array haben.<br />
Auch ist es erforderlich, zuerst die maximale Länge des größten Datensatztes durchzumessen, um zu wissen, welche Größe man ungefähr wählt, man möchte ja noch ein wenig Sicherheit nach oben.</p>
<p>Bei std::strings würde sich das doch alles erübrigen oder?<br />
Die nehmen immer die Länge an, die sie brauchen und verschwenden nicht soviel Speicher.<br />
Ist das wirklich so? Dann wären std::strings ja dem normalen char Array völlig überlegen. Oder haben diese super intelligenten Textspeicher auch unangenehme Nachteile?</p>
<p>Wäre mal über ein Aufklärung und Meinungen sehr erfreut.<br />
(Habe mich bisher immer vor std::strings ferngehalten, weil die mir nicht so geheuer waren)</p>
<p>Gruß,<br />
DC</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/279290/strings-versus-textarrays</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 16:23:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/279290.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 22 Dec 2010 20:11:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Strings versus TextArrays on Wed, 22 Dec 2010 20:11:33 GMT]]></title><description><![CDATA[<p>Guten Abend,</p>
<p>ich hätte da nun auch mal einige Fragen zu Strings und Char-Arrays.</p>
<p>1.Beispiel:</p>
<pre><code>const int GR = 10000;
char rohstring[GR]
file.getline(rohstring,GR);
</code></pre>
<p>So habe ich ja hier ja quasi einen Eingabepuffer mit fester Größe.</p>
<p>Nehme ich aber so etwas:</p>
<pre><code>std::string rohstring;
getline(file,rohstring)
</code></pre>
<p>Da habe ich ja nun einen String, der ja größendynamisch ist, also seine Größe je nach dem was man reinpackt dynamisch anpasst.</p>
<p>Wenn also nun in der Datei Zeilen mit 1000 bis 8000 Zeichen Länge sind, so ist die obere Variante ein wenig Speicherintensiver und eventuell sogar zu gross gewählt, während die string Variante ja immer den exakten Speicher für die aktuelle Zeile belegt.<br />
Aber leidet dann nicht auch ein wenig die Performance, was sich dann bei 70000 Zeilen vielleicht auch stark bemerkbar macht weil der String ja ständig in seiner Größe rauf und runter pendelt?<br />
Was sagen die Experten?</p>
<p>2.Beispiel:</p>
<pre><code>struct Buecher
{
char sku[10];
char stichwort[150];
char titel[350];
char utitel[350];
char autor[150];
char auflage[120];
char verlag[120];
char format[120];
char seiten[60];
char jahrT[20];
char einband[50];
char zustandT[350];
char zustandZ[30];
char gewichtT[10];
char dataender[25];
char daterstell[25];
char preisT[10];
char sprache[30];
char isbn[20];
char amakat[100];
char isbn13[20];
char intinfo[150];
char mengeT[5];
char sach1[300];
char exportT[10];
}buch[200000];
</code></pre>
<p>Hier ist eine ziemlich fette Struktur, die dazu dient, 200000 Buecher mit ihren Daten wie Titel, Verlag, Autor usw. aufzunehmen.<br />
(Mittlerweile arbeite ich mit einer Dateigepufferten Variante. Ich lese also nicht mehr alle Bücher ein, sondern hole mir immer den relevanten Datensatz aus der Datei) Aber mich würde trotzdem mal an dem Beispiel mit den 200000 Buchstrukturen interessieren inwie hier nun die String Variante besser ist.</p>
<pre><code>struct Buecher
{
std::string sku;
std::string stichwort;
std::string titel;
.
.
}buch[200000];
</code></pre>
<p>Im char Beispiel habe ich ja bei 200000 Datensätzen eine wahnsinnige Speicherverschwendung, weil ja alle Strukturelemente in der Größe festgesetzt sind und demnach kürzere Texte viel zu viel Platz im Array haben.<br />
Auch ist es erforderlich, zuerst die maximale Länge des größten Datensatztes durchzumessen, um zu wissen, welche Größe man ungefähr wählt, man möchte ja noch ein wenig Sicherheit nach oben.</p>
<p>Bei std::strings würde sich das doch alles erübrigen oder?<br />
Die nehmen immer die Länge an, die sie brauchen und verschwenden nicht soviel Speicher.<br />
Ist das wirklich so? Dann wären std::strings ja dem normalen char Array völlig überlegen. Oder haben diese super intelligenten Textspeicher auch unangenehme Nachteile?</p>
<p>Wäre mal über ein Aufklärung und Meinungen sehr erfreut.<br />
(Habe mich bisher immer vor std::strings ferngehalten, weil die mir nicht so geheuer waren)</p>
<p>Gruß,<br />
DC</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1998068</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1998068</guid><dc:creator><![CDATA[Don Carsto]]></dc:creator><pubDate>Wed, 22 Dec 2010 20:11:33 GMT</pubDate></item><item><title><![CDATA[Reply to Strings versus TextArrays on Wed, 22 Dec 2010 20:26:32 GMT]]></title><description><![CDATA[<p>Naja, du machst dabei ja (neben wesentlich viel mehr Komfort und gegen null tendierender Fehleranfälligkeit) einen Kompromiss zwischen Speicher und Laufzeit. Ferner ist der Datenspeicher eines strings nicht immer genauso groß wie die enthaltenen Daten, sondern <strong>mindestens</strong> so groß.<br />
Sagen wir mal, du erwartest normalerweise nicht mehr als 100 chars. Dann kannst du dem string per reserve schonmal sagen, dass er Platz für 100 bereithalten soll. Falls dann doch mal längere Zeilen kommen, dann sorgt die string-klasse auf jeden Fall automatisch für mehr speicher (ich kenne die häufig benutzte Strategie dafür jetzt aber nicht (Implementierungsabhängig), auf jeden Fall klüger als jedes mal nur 1 Byte mehr und alles kopieren...).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1998080</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1998080</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 22 Dec 2010 20:26:32 GMT</pubDate></item><item><title><![CDATA[Reply to Strings versus TextArrays on Wed, 22 Dec 2010 20:27:47 GMT]]></title><description><![CDATA[<p>Don Carsto schrieb:</p>
<blockquote>
<p>r.<br />
Ist das wirklich so? Dann wären std::strings ja dem normalen char Array völlig überlegen.</p>
</blockquote>
<p>Du hast es erfasst. Und auch begründet. Und noch viele weitere Gründe gar nicht erwähnt.</p>
<blockquote>
<p>Oder haben diese super intelligenten Textspeicher auch unangenehme Nachteile?</p>
</blockquote>
<p>Sie sind ein bisschen langsamer. Was eher selten ins Gewicht fällt, weil Stringverarbeitung selten Performancerelevant ist. Der Performanceverlust spielt jeweils an den Stellen eine Rolle wo man die Zusatzfeatures des Strings benutzt, eben wie beim besagten Einlesen. Würde man den gleichen Effekt nachbauen, indem man char-Arrays dynamisch anlegt, hätte man bei beiden die gleiche Laufzeit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1998081</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1998081</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 22 Dec 2010 20:27:47 GMT</pubDate></item><item><title><![CDATA[Reply to Strings versus TextArrays on Wed, 22 Dec 2010 21:14:17 GMT]]></title><description><![CDATA[<p>Ja, danke erstmal für die hilfreichen Beiträge.</p>
<p>Ich werde mich dann mal intesiver mit std::string Klasse beschäftigen.</p>
<p>Nur was ist, wenn ich nun sowas hier habe:</p>
<pre><code>char *bigbuffer = new char[VeryVeryBig];
</code></pre>
<p>(Wie prüfe ich hier eigentlich, ob das System mir auch Speicher gibt?)</p>
<p>Aber angenommen, ich fordere Speicher für einen Riesigen Text an, das System gibt ihn mir und ich kann auch prüfen, daß ich ihn bekommen habe, dann bin ich hier doch auf der sicheren Seite.</p>
<p>Wenn ich aber dann:</p>
<pre><code>std::string *bigbuffer = new std::string;
</code></pre>
<p>Dann habe ich zum Einen, keine Größenangabe für die Reservierung und zum Zweiten wäre das doch total unsinnig, weil diese obige Definition ja identisch mit:</p>
<pre><code>std::string bigbuffer;
</code></pre>
<p>wäre.</p>
<p>Und wenn ich nun einen Text mit der Länge VeryVeryBig einfach mal in diesen String packe, dann wäre das ja wieder Hammermethode, nach dem Motto, wird schon passen.<br />
Wahrscheinlich gibt es aber Klassenfunktionen, mit denen ich meinem String eine Minimalgröße verpassen kann und auch prüfen, ob der Speicher vorhanden ist, aber aufgrund der Dynamik in der Größe könnte es doch dann irgendwann doch nicht mehr passen?</p>
<p>Naja, ich werde mich mal in den nächsten Tagen mehr mit der C++ Klassenbibliothek befassen. (Hatte bisher kein anständiges Buch. Nun bekomme ich übermorgen den C++ Programmierer geliefert. Uhhh, teuer.. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> )<br />
(Aber immer nur C++ für Dummies als einziges C++ Buch, das erweitert nicht wirklich den Programmierhorizont)</p>
<p>Aber wie dem auch sei, sobald ich mehr Erfahrung mit der string-Klasse gemacht habe, erschließen sich mir wahrscheinlich auch einige Dinge, so daß sich solche Fragen wie die bisherigen erübrigen, aber ein wenig SmallTalk ist auch mal schön...</p>
<p>Und dieser Größendynamik, ich weiß nicht, ist mir nicht so ganz geheuer..<br />
!!!Das ist Hexenwerk.....!!! !!Verbrennt die String-Klasse...!!</p>
<p>Gruß,<br />
DC</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1998103</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1998103</guid><dc:creator><![CDATA[Don Carsto]]></dc:creator><pubDate>Wed, 22 Dec 2010 21:14:17 GMT</pubDate></item><item><title><![CDATA[Reply to Strings versus TextArrays on Wed, 22 Dec 2010 21:29:18 GMT]]></title><description><![CDATA[<p>Wenn du mehr Speicher anforderst als du bekommen kannst, fliegt eine <em>bad_alloc</em>-Exception. Sowohl bei manuellen allozierten Arrays als auch bei std::string.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1998108</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1998108</guid><dc:creator><![CDATA[wx++]]></dc:creator><pubDate>Wed, 22 Dec 2010 21:29:18 GMT</pubDate></item><item><title><![CDATA[Reply to Strings versus TextArrays on Wed, 22 Dec 2010 21:41:00 GMT]]></title><description><![CDATA[<p>Don Carsto schrieb:</p>
<blockquote>
<pre><code>std::string *bigbuffer = new std::string;
</code></pre>
<p>Dann habe ich zum Einen, keine Größenangabe für die Reservierung und zum Zweiten wäre das doch total unsinnig, weil diese obige Definition ja identisch mit:</p>
</blockquote>
<p>...dann hättest du einen Zeiger auf ein std::string-Objekt, ja.<br />
std::string macht intern den ganzen Firlefanz mit new usw. für dich! Das ist doch das Feature von der Klasse. Der nimmt dir das alles ab, mit den Tests, ob etwas passt, ob mehr Speicher gebraucht wird, etc.<br />
Du kannst in einen std::string soviel reinpacken, wie dein PC bzw. dein Adressraum zulässt. D.h. bei std::string stürzt es nicht ab, weil der String zu lang ist, sondern weil dein PC zu wenig Speicher hat, sozusagen.<br />
Missverstehe std::string nicht als eingebauten Typ! Das ist eine C++ Klasse. Dass man ihren Objekten Stringliterale ( &quot;asfafs&quot; ) zuweisen kann, liegt an impliziten Konvertierungen und Operatoren und Konstruktoren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1998110</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1998110</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 22 Dec 2010 21:41:00 GMT</pubDate></item><item><title><![CDATA[Reply to Strings versus TextArrays on Wed, 22 Dec 2010 21:49:47 GMT]]></title><description><![CDATA[<p>Ja, das stimmt. Ich erwische immer wieder dabei, wie ich std:string als Typ ansehe und nicht als Klasse. Natürlich, als Klasse betrachtet, verwaltet sich das Dingen ja dann selbst.</p>
<p>Muß ich mir einbläuen... Es ist eine Klasse und kein Typ....</p>
<p>Gruß,<br />
DC</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1998112</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1998112</guid><dc:creator><![CDATA[Don Carsto]]></dc:creator><pubDate>Wed, 22 Dec 2010 21:49:47 GMT</pubDate></item><item><title><![CDATA[Reply to Strings versus TextArrays on Thu, 23 Dec 2010 10:35:23 GMT]]></title><description><![CDATA[<p>Hä? Warum ist eine Klasse kein Typ? Wer erzählt denn so was? Natürlich sind Klassen auch Typen!</p>
<pre><code class="language-cpp">string a; // Objekt a vom Typ String
</code></pre>
<p>Was sollen Klassen sonst sein?</p>
<p>Und das schöne an C++ ist auch, das sich die Klassen so konstruieren lassen, das sie sich sogar wie eingebaute Typen anfühlen. Dafür ist Operator-Überladungen da.</p>
<p>Im inneren der String-Klasse wird natürlich alles versteckt, und es ist am Ende kein Hexenwerk, sondern normales C++. Aber interessiert das wirklich? So lange die Klasse so arbeitet, wie vorgesehen, ist das irrelevant, ob C++-new oder Assemblercode in der Klasse steht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1998213</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1998213</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Thu, 23 Dec 2010 10:35:23 GMT</pubDate></item><item><title><![CDATA[Reply to Strings versus TextArrays on Thu, 23 Dec 2010 18:33:30 GMT]]></title><description><![CDATA[<p>Anbei noch die eleganteste Lösung zum Lesen aus Dateien: (relativ performant, müsstest du mal ausprobieren, ist bei mir glaube ich effektiver als in einen char* einzulesen:</p>
<pre><code class="language-cpp">#include &lt;fstream&gt;
#include &lt;sstream&gt;

std::string ReadFromFile(std::string name)
{
    std::ifstream input;
    input.open(name.c_str());
    if(!input.is_open())
    {
        return &quot;&quot;;  //hier sollte man evtl. eine Exception werfen
    }
    std::ostringstream filecontent_stream;
    filecontent_stream &lt;&lt; input.rdbuf();
    input.close();
    return filecontent_stream.str();
}
</code></pre>
<p>An die Grenzen von std::string stößt du eigentlich erst dann, wenn du Unicode verwenden willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1998416</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1998416</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Thu, 23 Dec 2010 18:33:30 GMT</pubDate></item><item><title><![CDATA[Reply to Strings versus TextArrays on Thu, 23 Dec 2010 18:51:03 GMT]]></title><description><![CDATA[<p>Danke für dieses Beispiel.<br />
Das werde ich mal eingehend testen.</p>
<p>Gruß,<br />
DC</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1998422</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1998422</guid><dc:creator><![CDATA[Don Carsto]]></dc:creator><pubDate>Thu, 23 Dec 2010 18:51:03 GMT</pubDate></item></channel></rss>