41 Stimmen

Definition von String-Konstanten für Klassen in C++?

Ich habe Code mit diesen beiden Stilen gesehen, ich bin mir nicht sicher, ob einer besser ist als der andere (ist es nur eine Frage des Stils)? Haben Sie irgendwelche Empfehlungen, warum Sie eine über eine andere wählen würde.

 //Example1
 class Test {

    private:
        static const char* const str;

};

const char* const Test::str = "mystr";

//Example2
class Test {

     private:
         static const std::string str;

};

const std::string Test::str ="mystr";

57voto

Johannes Schaub - litb Punkte 479831

Normalerweise sollten Sie Folgendes bevorzugen std::string über einfache Char-Zeiger. Hier hat der mit dem String-Literal initialisierte char-Zeiger jedoch einen erheblichen Vorteil.

Es gibt zwei Initialisierungen für statische Daten. Die eine wird als statische Initialisierung bezeichnet, die andere als dynamische Initialisierung. Bei Objekten, die mit konstanten Ausdrücken initialisiert werden und die PODs sind (wie Zeiger), verlangt C++, dass ihre Initialisierung ganz am Anfang erfolgt, bevor die dynamische Initialisierung stattfindet. Die Initialisierung eines solchen std::string wird dynamisch durchgeführt.

Wenn Sie ein Objekt einer Klasse haben, das ein statisches Objekt in einer Datei ist, und das während seiner Initialisierung auf die Zeichenkette zugreifen muss, können Sie sich darauf verlassen, dass es bereits eingerichtet ist, wenn Sie die const char* const Version, während bei der Verwendung der std::string Version, die nicht statisch initialisiert wird, wissen Sie nicht, ob die Zeichenkette bereits initialisiert ist, da die Reihenfolge der Initialisierung von Objekten über die Grenzen von Übersetzungseinheiten hinweg nicht definiert ist.

4voto

Starkii Punkte 1091

Hmmm, ein std::string ist nicht dasselbe wie ein const char *. Normalerweise bevorzuge ich std::string, weil diese Klasse viele zusätzliche Möglichkeiten bietet, die ihre Verwendung wesentlich erleichtern.

Wenn die Leistung im Vordergrund steht und Sie aus Effizienzgründen const char * verwenden, sollten Sie diesen Weg wählen.

3voto

goku3989 Punkte 41

Ich neige dazu, std::string gegenüber char * zu bevorzugen, wenn ich C++ verwende. Ich bevorzuge std::string hauptsächlich wegen seiner eingebauten Fähigkeiten sowie der Bequemlichkeit und Sicherheit, nicht mit Zeigern umgehen zu müssen.

Wie andere jedoch bereits erwähnt haben, kann die const char * Version vorteilhaft sein, wenn Sie übermäßig besorgt über die Leistung sind. Ich glaube mich zu erinnern, dass ein kluger Mensch einmal gesagt hat, dass verfrühte Optimierung die Wurzel allen Übels ist (oder so ähnlich). :)

2voto

Judge Maygarden Punkte 25975

Das erste Beispiel erfordert weniger Overhead für die Verwaltung der Zeichenkette (d. h. nur einen Zeiger auf den TEXT-Abschnitt). Die zweite Methode erfordert möglicherweise auch eine Heap-Allokation, um das String-Literal in den Puffer der Klasse std:string zu kopieren. Sie hätten also am Ende zwei Kopien der Daten.

2voto

maccullt Punkte 2719

In großen Projekten, an denen mehrere Plattformen mit unterschiedlichen Compilern und Bibliotheken, viele Teams und viele Leute beteiligt sind, sind wir immer wieder auf Probleme mit statischen std::strings gestoßen. Auf einigen Plattformen ist die std:string-Implementierung nicht thread-sicher. Auf einer Plattform übersprang der vom Compiler optimierte Code die Initialisierung einer lokalen std:string aus der globalen static const. Nachdem wir einigen dieser Probleme nachgegangen sind, erlauben wir globale statische Konstanten nur für eingebaute Typen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X