41 votes

Définir des constantes de chaînes de classes en C ++?

J'ai vu le code autour de ces deux styles, je ne suis pas sûr si l'un est meilleur qu'un autre (est-ce juste une question de style)? Avez-vous des recommandations sur les raisons pour lesquelles vous choisiriez un sur un autre?

  //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";
 

56voto

Johannes Schaub - litb Points 256113

Habituellement, vous devriez préférer std::string - dessus de la plaine char pointeurs. Ici, cependant, le char pointeur initialisé avec la chaîne de caractères littérale a un avantage significatif.

Il y a deux initialisations pour les données statiques. L'une, appelée initialisation statique, et l'autre, la dynamique de l'initialisation. Pour les objets qui sont initialisés avec des expressions constantes et qui sont des Gousses (comme des pointeurs), C++ exige que l'initialisation se passe au tout début, avant dynamique de l'initialisation se passe. L'initialisation d'une std::string sera fait de façon dynamique.

Si vous avez un objet de la classe d'un objet statique dans un fichier, et que l'on a besoin pour accéder à la chaîne lors de son initialisation, vous pouvez compter sur eux pour le set-up déjà lorsque vous utilisez l' const char* const version, tout en utilisant l' std::string version, ce qui n'est pas initialisé de manière statique, vous ne savez pas si la chaîne est déjà initialisé - parce que l'ordre de l'initialisation des objets dans l'ensemble de l'unité de traduction de limites n'est pas défini.

4voto

Starkii Points 729

Hmmm, un std :: string n'est pas la même chose qu'un const char *. J'utilise généralement std :: string parce que c'est une classe qui possède de nombreuses fonctionnalités supplémentaires qui la rendent beaucoup plus facile à utiliser.

Si les performances sont primordiales et que vous utilisez const char * pour plus d’efficacité, optez pour cela.

3voto

goku3989 Points 41

J'ai tendance à privilégier std :: string plutôt que char * lorsque je fais du C ++. Je préfère std :: string principalement pour ses fonctionnalités intégrées, ainsi que pour sa commodité et sa sécurité, sans avoir à traiter avec des pointeurs.

Cependant, comme d'autres l'ont mentionné, la version de const char * peut être favorable si vous êtes trop préoccupé par les performances. Il me semble rappeler que quelqu'un d'intelligent a déjà déclaré que l'optimisation prématurée était la racine de tous les maux (ou autres). :)

2voto

Judge Maygarden Points 14964

Le premier exemple nécessite moins de temps système pour la gestion de la chaîne (c’est-à-dire un simple pointeur sur la section TEXT). En outre, la deuxième méthode peut également nécessiter une allocation de segment de mémoire pour copier le littéral de chaîne dans le tampon de classe std: string. Donc, vous vous retrouveriez avec deux copies des données.

2voto

maccullt Points 1555

Dans les grands projets impliquant plusieurs plates-formes avec différents compilateurs et bibliothèques, de nombreuses équipes et de nombreuses personnes, nous avons souvent rencontré des problèmes avec static std :: strings. Sur certaines plates-formes, l'implémentation std: string n'est pas thread-safe. Sur une plate-forme, le code optimisé pour le compilateur ignoré lors de l'initialisation d'un std: string local forme le const statique global. Après avoir résolu quelques-uns de ces problèmes, nous n'autorisons les constantes statiques globales que pour les types intégrés.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X