Frage

Gibt es einen guten Grund, C-Strings in C ++ heute zu benutzen? Mein Lehrbuch verwendet sie in den Beispielen an einigen Punkten, und ich wirklich das Gefühl, wie es nur einfacher wäre, ein std :: string zu verwenden.

War es hilfreich?

Lösung

Die einzigen Gründe, warum ich sie hätte zu verwenden sind, wenn sie mit 3rd-Party-Bibliotheken, die eine Schnittstelle C Strings verwenden. Es könnte auch esoterische Situationen, in denen Sie C Strings aus Performance-Gründen, aber mehr als oft nicht, mit Methoden, die auf C ++ Strings ist wahrscheinlich schneller durch inlining und Spezialisierung, etc. verwenden würden.

Sie können die c_str() Methode in vielen Fällen bei der Arbeit mit dieser Art von APIs, aber sollen Sie sich bewusst sein, dass die char * zurück sind const, und Sie sollten die Zeichenfolge über diesen Zeiger nicht ändern. In dieser Art von Situationen können Sie noch einen Vektor verwenden statt, und zumindest den Vorteil der leichteren Speicherverwaltung erhalten.

Andere Tipps

Ein paar mehr Speichersteuer Hinweise:

C-Strings sind POD-Typen, also können sie in Ihrer Anwendung schreibgeschützte Datensegment zugeordnet werden. Wenn Sie std::string Konstanten im Namespace Umfang erklären und definieren, wird der Compiler zusätzlichen Code erzeugen, bevor main() läuft, der den std::string Konstruktor für jede Konstante nennt. Wenn Ihre Anwendung viele constant strings hat (zum Beispiel, wenn Sie C ++ Code generiert haben, die konstante Strings verwendet), C-Strings in dieser Situation vorzuziehen sein kann.

Einige Implementierungen von std::string eine Funktion unterstützen SSO genannt ( „short-String-Optimierung“ oder „kleine String-Optimierung“), wo die std::string Klasse enthält Speicher für Strings bis zu einer bestimmten Länge. Dadurch erhöht sich die Größe der std::string aber oft erheblich reduziert die Häufigkeit von Freispeicher Zuteilungen / Freigaben, die Verbesserung der Leistung. Wenn Ihre Implementierung von std::string nicht SSO unterstützt, dann auf dem Stapel eine leere std::string Konstruktion wird noch ein Freispeicher Zuteilung durchzuführen. Wenn das der Fall ist, unter Verwendung von temporären Stapel zugewiesen C-Strings für leistungskritische Code kann hilfreich sein, die Zeichenketten verwendet. Natürlich müssen Sie nicht schießen selbst in den Fuß vorsichtig sein, wenn Sie dies tun.

Weil das ist, wie sie von zahlreichen API / Bibliotheken kommen?

Angenommen, Sie haben einige String-Konstanten in Ihrem Code haben, der ein ziemlich häufiges Bedürfnis ist. Es ist besser, diese als C-Strings als als C ++ Objekte zu definieren - mehr leicht, tragbar, usw. Nun, wenn Sie diese Zeichenfolge zu vorbei, um verschiedene Funktionen gehen, es ist schön, wenn diese Funktionen einen C-String statt erfordern eine akzeptieren C ++ String-Objekt.

Natürlich, wenn die Saiten wandelbar sind, dann ist es viel bequemer, C ++ String-Objekte zu verwenden.

Die Speichersteuerung. Ich musste vor kurzem Strings verarbeiten (eigentlich Blobs aus einer Datenbank) ca. 200-300 MB groß, in einer massiv Multithread-Anwendung. Es war eine Situation, in der nur-ein-mehr Kopie des Strings könnte den 32-Bit-Adressraum geplatzt. Ich hatte genau zu wissen, wie viele Kopien der Zeichenfolge vorhanden waren. Obwohl ich ein STL Evangelist bin, habe ich char * dann, weil es mir die Garantie gegeben, dass keine zusätzlichen Speicher oder sogar zusätzliche Kopie zugeordnet wurde. Ich wusste genau, wie viel Platz es benötigen würde.

Abgesehen davon, dass Standard STL Stringverarbeitung fehlt auf einigen großen C-Funktionen aus für String-Verarbeitung / Analyse. Zum Glück std :: string hat die c_str () Methode für const Zugriff auf den internen Puffer. So verwenden Sie printf () Sie müssen noch char * wenn (was für eine verrückte Idee des C ++ Team nicht enthalten (s) printf-ähnliche Funktionalität, eine der nützlichsten Funktionen HAUPT in C. hoffe ich boost :: Format wird bald in der STL enthalten sein.

Wenn eine Funktion ein Konstante string muss ich immer noch lieber 'const char *' verwenden (oder const wchar_t *), auch wenn das Programm verwendet std :: string, CString, EString oder anderswo, was auch immer.

Es gibt einfach zu viele Quellen von Strings in einer großen Code-Basis um sicherzustellen, dass der Anrufer die Zeichenfolge als std hat :: string und ‚const char *‘ ist der kleinste gemeinsame Nenner.

Lehrbücher sind mit Old-School-C-Strings, weil viele grundlegende Funktionen sie noch als Argumente erwarten, oder sie zurück. Darüber hinaus gibt es einen Einblick in die zugrunde liegende Struktur des Strings im Speicher.

Wenn der C ++ Code ist „tief“ (nahe der Kernel, stark abhängig von C-Bibliotheken, etc.) Sie C-Strings verwenden möchten explizit viele Umwandlungen zu vermeiden, um und aus std :: string. Von, könnte man aus dem gleichen Grunde tun, wenn Sie mit anderen Sprachdomänen (Python, Ruby, etc.) sind Schnittstellen. Andernfalls verwenden std :: string.

Einige Beiträge erwähnen Speicher betrifft. Das könnte ein Grund sein std zu meiden :: string, aber char * ist wahrscheinlich nicht der beste Ersatz. Es ist immer noch eine OO-Sprache. Ihre eigene String-Klasse ist wahrscheinlich besser als ein char *. Es kann noch effizienter sein - die kleine String Optimierung anwenden kann, zum Beispiel.

In meinem Fall, ich habe versucht, über 1 GB im Wert von Strings aus einer 2 GB-Datei zu bekommen, stopfen sie mit etwa 60 Felder in Datensätzen und dann sortieren sie 7-mal von verschiedenen Bereichen. Meine Vorgänger Code dauerte 25 Stunden mit char *, lief mein Code in 1 Stunde.

Nach weit verbringen, weit, zu viel Zeit Regeln Initialisierung Debuggen und jede denkbare String-Implementierung auf mehreren Plattformen wir statische Strings benötigen * const char sein.

Nach weit verbringen, weit, zu viel Zeit Debuggen schlecht char * Code und Speicherlecks Ich schlage vor, dass alle nicht-statische Strings irgendeine Art von String-Objekt sein ... bis Profilierung zeigt, dass Sie kann und besser etwas tun soll; - )

die Wahl, gibt es im Allgemeinen keinen Grund, primitive C-Strings (char*) über C ++ Strings (std::string) zu wählen. Doch oft haben Sie nicht den Luxus der Wahl. Zum Beispiel std::fstream die Konstrukteure nehmen C-Strings, die aus historischen Gründen. Auch C-Bibliotheken (Sie ahnen es!) Verwenden C-Strings.

In Ihrem eigenen C ++ Code ist es am besten std::string zu verwenden, und das C-String des Objekts zu extrahieren, wie mit dem c_str() Funktion von std::string .

Es hängt von den Bibliotheken Sie verwenden. Wenn zum Beispiel der Arbeit mit dem MFC , dann ist es oft einfacher, CString zu verwenden, wenn mit verschiedenen Teilen arbeiten der Windows-API. Es scheint auch besser ab als std :: string in Win32-Anwendungen.

Allerdings std :: string ist Teil der C ++ Standard, so dass, wenn Sie eine bessere Portabilität wollen, gehen Sie mit std :: string.

Für Anwendungen wie die meisten Embedded-Plattformen, auf denen Sie die Saiten speichern nicht den Luxus eines Haufens haben manipuliert werden, und wo determinis Vorbelegung von String-Puffer erforderlich ist.

c Strings tragen nicht den Overhead eine Klasse zu sein.

c-Strings können in der Regel zu einer schnelleren Code führen, da sie näher an die Maschine Ebene

Dies ist nicht zu sagen, Sie nicht schlecht Code mit ihnen schreiben können. Sie können missbraucht werden, wie jedes andere Konstrukt.

Es gibt eine Fülle von libary Anrufen, die sie aus historischen Gründen verlangen.

Lernen c Strings zu verwenden, und stl Strings und jeden verwenden, wenn es sinnvoll, dies zu tun macht.

1) "String-Konstante" ist ein C-String (const char *), um es zu const std :: string Umwandlung & ist Laufzeit Prozess, nicht unbedingt einfach oder optimiert. 2) fstream Bibliothek verwendet C-Strings Dateinamen zu übergeben.

Faust Meine Regel ist const std :: string passieren und wenn ich über die Daten als std :: string verwenden sowieso (sagen wir, wenn ich sie in einem Vektor speichern) und const char * in anderen Fällen.

Legacy-Code, der nicht weiß, von std :: string. Auch vor dem C ++ 11 Öffnen von Dateien mit std :: ifstream oder std :: ofstream war nur möglich, mit const char * als Eingabe in den Dateinamen.

STL-Strings sind sicherlich viel einfacher zu bedienen, und ich sehe keinen Grund, sie nicht zu verwenden.

Wenn Sie mit einer Bibliothek zu interagieren müssen, die nur C-Strings als Argumente übernehmen, können Sie immer rufen Sie den c_str () -Methode der String-Klasse.

Der üblichen Grund, es zu tun ist, dass Sie in Ihrem String-Handling-Schreibpufferüberlauf genießen. Gezählt Strings sind so überlegen terminierten Strings ist es schwer zu sehen, warum die C-Designer immer terminierten Strings verwendet. Es war eine schlechte Entscheidung dann; es ist eine schlechte Entscheidung jetzt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top