Strings oder Char?
-
Hallo
weil C-Strings (char*, char[]) mitsamt ihren dazugehörigen Funktionen grundsätzlich aus C-zeiten sind. Dasheißt du must dich entweder selber um die Speichereservierung und -freigabe kümmern, oder du hast ein Array mit fester Größe. Es gibt unter den alten C-Funktionen einige, die Speicherlecks und Bufferoverflows gerade für Anfänger herausfordern.
Bei std::string hast du solche Probleme nicht, es verwaltet seinen Speicher selbst.
bis bald
akari
-
Es sprechen sowieso nur wenige Dinge für char-arrays gegenüber strings. char-arrays sind nicht ganz einfach zu benutzen, es ist leicht fehler zu machen und so sicherheitslücken oder Abstürze zu produzieren.
Gerade wenn Du aber auf einfache Benutzbarkeit Wert legst gewinnt std::string haushoch. Der bietet einfach viel mehr Funktionalität und kümmert sich um viele kleine Fallstricke. Viele Funktionen wie substr und find sind in std::string schon fertig implementiert und Du mußt sie nur noch aufrufen. Dagegen sind die C-Funktionen zur Manipulation von char-arrays sehr mager. Insbesondere zusammenhängen von strings und solche Sachen sind damit sehr einfach, weil std::string sich selbständig um ausreichenden Speicher kümmert. Genau da liegt auch die Schwäche von std::string. Er ist langsamer, wenn Du auf die Speicherverwaltung verzichten könntest und durch eigene Bereitstellung schneller sein könntest. Allerdings ist das dann zumeist nicht gerade einfach. Meiner Erfahrung nach läßt sich mit std::string fast immer mindestens genauso schneller Code wie mit char-arrays schreiben, nur ist dieser einfacher und besser lesbar.
-
relaX schrieb:
Hi,
danke erstmal für die Antwort.
Ich will wirklich nicht unhöflich erscheinen, aber könntest du deine Antwort begründen?
Ich würde nämlich gerne wissen, wieso es so ist ^^Danke schon mal

Hi,
wie schon gesagt: Mit string kannst Du alles machen, ws man auch mit char-Arrays machen kann, aber
- einfacher,
- übersichtlicher,
- deutlich weniger fehleranfällig,
- ...
("strings: Das ist sexy", hätte ein niederländischer Kollege von mir wohl gesagt)Gruß,
Simon2.
P.S.: Es gibt gaaaanz wenige Dinge, wo char-Arrays die Nase vorn haben, aber das sind wirklich seltene Ausnahmen (meistens im Zusammenhang mit C- oder schlechten APIs) - und diese steinigen Pfade sollten nur Leute beschreiten, die es unbedingt müssen.
-
Jester schrieb:
Meiner Erfahrung nach läßt sich mit std::string fast immer mindestens genauso schneller Code wie mit char-arrays schreiben, nur ist dieser einfacher und besser lesbar.
Strings sind langsamer und da sie auf char* Arrays basieren niemals schneller.
Die Vorteile, die Du sonst aufzählst, sind natürlich korrekt.Ein Vorteil haben char Arrays allerdings. Die Datenstruktur ist festgelegt und unveränderlich. Man kann damit leicht Optimierungen vornehmen und zum Beispiel Speicher sparen, in dem man den Buffer eines Arrays mehrfach verwendet.
Das wäre mit Strings riskant, da man in den privaten Daten eines Strings nichts zu suchen hat.Für derartige Optimierungen sollte man allerdings wirklich wissen, was man tut.
-
Xin schrieb:
Strings sind langsamer und da sie auf char* Arrays basieren niemals schneller.
Die Vorteile, die Du sonst aufzählst, sind natürlich korrekt.Sie sind nicht langsamer. Zumindest in den meisten Fällen. Die Länge eines std::string kann in konstanter Zeit berechnet werden. Für einen C-String ist das nicht möglich. Macht man sich in Fällen wo das wichtig ist nicht die Mühe die Länge in ner zusätzlichen Variable mitzuführen und versucht ne ähnlich einfache Implementierung wie mit std::string hinzuschreiben, dann ist std::string sogar schneller. Daß man es mit viel Mühe immer so hinhacken kann, daß es gleichschnell ist, ist klar. Trotzdem kann man so pauschal nicht sagen, daß std::string langsamer ist und man mit char-arrays immer genauso schnell ist.
-
Da std::string intern selbst Arrays verwendet, kann es garnicht langsamer sein. Auch merkt sich die Klasse die Länge der Zeichen und muß nicht blind nach einer Nullterminierung suchen. Wenn ich bedenke wie ineffektiv es ist, wenn z.B. ein C-String 1 Mio. Zeichen lang ist und dann das Terminierungszeichen suchen muß... oh waier. In der Zeit hab ich mit std::string schon 1 Mio. andere Strings abgearbeitet.
Das einzige wo std::string einen "Nachteil" hat, ist das es natürlich meistens mehr Speicher reserviert, als es eigentlich benötigt. Aber das ist kein Performancenachteil (gerade das wird ja dadurch verhindert!), sondern kann halt bei extensiver String-Ansammlung viel Speicherverbrauch mitsich bringen.
Hier wäre eine nicht veränderbare String-Klasse noch nötig, die sich wie std::string benutzen lässt, aber nur einmal einen konstanten String hält und somit nur soviel Zeichen reserviert, wie auch drin ist. So könnte man C-Strings endgültig verbannen.
Das mit dem Speicherverbrauch sehe ich aber nicht bei allen Anwendungscenarien für bedeutend. Wer eine Grafikprogramm entwickelt, wird über die paar std::string-Objekte müde lächeln.

-
Achja, hier wird wegen Speicherverbrauch diskuttiert, welcher in den selteneren Szenarien Bedeutung finden wird. Aber es wird eines mal wieder bei den C-Strings unter den Tisch gekehrt bzw. zu weig Beachtung geschenkt: Sicherheit! Ein C-String kann niemals sicher sein, wie ein std::string. Er ist sogar von Haus aus unsicher. Alleine aus dem Grund, würde ich std::string vorziehen. Und wenn ich doch mal ein System entwickle, wo extensiv Strings gespeichert wrerden, dann würde ich mir wenigstens eine String-Klasse suchen, die konstante Zeichenlängen unterstützt. Aber C-String? Dann darf man sich nicht wieder über Bufferoverflow-Meldungen bei heise.de wundern!
-
Artchi schrieb:
Er ist sogar von Haus aus unsicher.
Schwachfug.
-
Ich glaube wenn man aus Performancegründen in einem Programm char arrays einbaut, dann spart man an der falschen stellen, denn erstens geht dabei viel Übersicht drauf, weil Strings eben viel leicht zu handhaben sind, und zweitens sind meistens Strings nicht so häufig verändert, dass sich eine Umstellung auf char* lohnt, Strings braucht man ja fast nur für Namen und Passwörter, die sich relativ selten Ändern, und somit ist eine komfortable Bedienung einer Geschwindigkeitsoptimierung vorzuziehen.
-
Artchi schrieb:
Achja, hier wird wegen Speicherverbrauch diskuttiert, welcher in den selteneren Szenarien Bedeutung finden wird. Aber es wird eines mal wieder bei den C-Strings unter den Tisch gekehrt bzw. zu weig Beachtung geschenkt: Sicherheit!
Kann es sein, daß Du die vorherigen Beiträge garnicht gelesen hast? Das steht doch da alles schon drin.
-
Artchi schrieb:
Da std::string intern selbst Arrays verwendet, kann es garnicht langsamer sein.
Als ich das las, wusste ich bereits, es lohnt nicht weiterzulesen... unnötigerweise las ich trotzdem bis
Artchi schrieb:
Ein C-String kann niemals sicher sein, wie ein std::string.
hier.
@Archi: Wenn Du virtuelle Funktionen verwendest ist das automatisch langsamer als wenn du es sein läßt. Es kann nicht nur langsamer sein: Es ist.
Da gibt's auch nix hin und her zu zu diskutieren. Zwei Zugriffe pro virtuellem Funktionsaufruf, rufen diese Funktionenen ebenfalls virtuelle Funktionen werden es endsprechend mehr.Mal ernsthaft... wenn die Länge des Strings so wichtig ist, fühlst Du Dich doch nicht überfordert, eine int-Variable mitzuspeichern, oder?
Wenn es nicht erforderlich ist, ist der C-String schneller, weil er sich um die Länge nicht kümmert.Ein C-String kann genauso sicher sein, wie ein std::string, wenn der Programmierer die Probleme, die Arrays beliebiger Art behaftet sind, kennt und berücksichtigt.
Ein Programmierer, der beliebige Arrays nicht beherrscht und bei einem C-String einen Fehler macht, muss auch einen Vektor nehmen, um mehrere Strings hintereinander zu packen.Wie macht so ein Programmierer, der immer nur mit Netz und doppeltem Boden programmiert, wenn er dann mal einen guten Algorithmus entwickeln soll.
Was ich unter einem guten Algorithmus verstehe, läuft schnell, einfach, fehlerfrei und grundsätzlich ohne Sicherheitsleine.Ich habe nichts gegen std::strings, ich habe auch nix gegen C-Strings.
Beide haben ihren Nutzen und ihren Sinn. Und weil beide Nutzen und Sinn haben, muss sich jeder fragen, der eines von beiden für das Böse im Programmieren hält, was er dabei nicht verstanden hat, oder warum er das vermeindlich Böse scheinbar nicht ausreichend im Griff hat.Auch C-Strings können Deine Freunde sein.
