Warum C-Strings in C++ verwenden?

Lesezeit: 4 Minuten

Benutzer-Avatar
Jason Baker

Gibt es heutzutage einen guten Grund, C-Strings in C++ zu verwenden? Mein Lehrbuch verwendet sie an einigen Stellen in Beispielen, und ich habe wirklich das Gefühl, dass es einfacher wäre, nur einen std::string zu verwenden.

Benutzer-Avatar
dvorak

Der einzige Grund, warum ich sie verwenden musste, war die Anbindung an Bibliotheken von Drittanbietern, die Zeichenfolgen im C-Stil verwenden. Es kann auch esoterische Situationen geben, in denen Sie Strings im C-Stil aus Leistungsgründen verwenden würden, aber in den meisten Fällen ist die Verwendung von Methoden für C++-Strings aufgrund von Inlining und Spezialisierung usw. wahrscheinlich schneller.

Du kannst den … benutzen c_str() -Methode in vielen Fällen, wenn Sie mit dieser Art von APIs arbeiten, aber Sie sollten sich darüber im Klaren sein, dass das zurückgegebene char * const ist, und Sie sollten die Zeichenfolge nicht über diesen Zeiger ändern. In solchen Situationen können Sie stattdessen immer noch ein vector verwenden und zumindest den Vorteil einer einfacheren Speicherverwaltung nutzen.

  • Der Rückgabewert ist aus einem bestimmten Grund konstant. Wenn Sie es mithilfe eines const_cast- oder C-Casts ändern, wird der interne Objektstatus desynchronisiert. Es sollte heißen „darf nicht ändern“, nicht „sollte nicht“.

    – Thorsten79

    21. September 2008 um 14:52 Uhr

Noch ein paar Anmerkungen zur Speichersteuerung:

C-Zeichenfolgen sind POD-Typen, sodass sie im schreibgeschützten Datensegment Ihrer Anwendung zugewiesen werden können. Wenn Sie erklären und definieren std::string Konstanten im Namespacebereich generiert der Compiler zusätzlichen Code, der zuvor ausgeführt wird main() das ruft die std::string Konstruktor für jede Konstante. Wenn Ihre Anwendung viele konstante Zeichenfolgen enthält (z. B. wenn Sie C++-Code generiert haben, der konstante Zeichenfolgen verwendet), sind C-Zeichenfolgen in dieser Situation möglicherweise vorzuziehen.

Einige Implementierungen von std::string unterstützen eine Funktion namens SSO (“Short String Optimization” oder “Small String Optimization”), bei der die std::string Klasse enthält Speicher für Zeichenfolgen bis zu einer bestimmten Länge. Dies erhöht die Größe von std::string reduziert jedoch häufig die Häufigkeit von Free-Store-Zuweisungen/Zuweisungsaufhebungen erheblich, wodurch die Leistung verbessert wird. Wenn Ihre Implementierung von std::string SSO nicht unterstützt, dann eine leere erstellen std::string auf dem Stack führt weiterhin eine Free-Store-Zuweisung durch. Wenn dies der Fall ist, kann die Verwendung von temporären Stack-zugewiesenen C-Strings für leistungskritischen Code, der Strings verwendet, hilfreich sein. Dabei muss man natürlich aufpassen, dass man sich nicht selbst ins Knie schießt.

Weil sie so aus zahlreichen APIs/Bibliotheken stammen?

Nehmen wir an, Sie haben einige String-Konstanten in Ihrem Code, was ein ziemlich häufiger Bedarf ist. Es ist besser, diese als C-Strings als als C++-Objekte zu definieren – leichter, portabler usw. Wenn Sie diese Strings nun an verschiedene Funktionen übergeben, ist es schön, wenn diese Funktionen einen C-String akzeptieren, anstatt einen zu benötigen C++-String-Objekt.

Wenn die Strings veränderbar sind, ist es natürlich viel bequemer, C++-String-Objekte zu verwenden.

Wenn eine Funktion a benötigt Konstante string Ich bevorzuge immer noch ‘const char*’ (oder const wchar_t*), auch wenn das Programm std::string, CString, EString oder was auch immer an anderer Stelle verwendet.

Es gibt einfach zu viele Quellen von Strings in einer großen Codebasis, um sicher zu sein, dass der Aufrufer den String als std::string hat und ‘const char*’ der kleinste gemeinsame Nenner ist.

Benutzer-Avatar
Zeichnete Stephens

Lehrbücher enthalten C-Strings der alten Schule, weil viele grundlegende Funktionen sie immer noch als Argumente erwarten oder zurückgeben. Darüber hinaus gibt es einen Einblick in die zugrunde liegende Struktur der Zeichenfolge im Speicher.

Benutzer-Avatar
Thorsten79

Speicherkontrolle. Ich musste kürzlich Zeichenfolgen (eigentlich Blobs aus einer Datenbank) mit einer Größe von etwa 200 bis 300 MB in einer Anwendung mit massivem Multithreading verarbeiten. Es war eine Situation, in der nur eine weitere Kopie der Zeichenfolge den 32-Bit-Adressraum gesprengt haben könnte. Ich musste genau wissen, wie viele Kopien der Zeichenfolge existierten. Obwohl ich ein STL-Evangelist bin, habe ich damals char * verwendet, weil es mir die Garantie gab, dass kein zusätzlicher Speicher oder sogar eine zusätzliche Kopie zugewiesen wurde. Ich wusste genau, wie viel Platz es brauchen würde.

Abgesehen davon fehlen bei der Standard-STL-String-Verarbeitung einige großartige C-Funktionen für die String-Verarbeitung/Parsing. Zum Glück hat std::string die Methode c_str() für den konstanten Zugriff auf den internen Puffer. Um printf() zu verwenden, müssen Sie jedoch immer noch char * verwenden (was für eine verrückte Idee des C++-Teams, keine (s)printf-ähnliche Funktionalität zu integrieren, eine der nützlichsten Funktionen überhaupt in C. Ich hoffe, boost::format wird es tun bald in die STL aufgenommen werden.

  • sprintf-ähnliche Funktionalität ist vorhanden – Sie müssen nur einen String-Stream und Standardausgabeoperatoren verwenden.

    – Branan

    22. September 2008 um 19:24 Uhr

  • @Branan: Ja, aber es ist nicht dasselbe und es wird sehr schnell sehr unangenehm, wenn Sie viele Parameter benötigen …

    – Andreas Bonini

    28. Oktober 2009 um 10:05 Uhr

1258700cookie-checkWarum C-Strings in C++ verwenden?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy