85 votes

char* vs std::string en c++

Quand dois-je utiliser std::string et quand dois-je utiliser char* pour gérer des tableaux de char en C++ ?

Il semble que vous devriez utiliser char* si la performance (vitesse) est cruciale et que vous êtes prêt à accepter un certain risque en raison de la gestion de la mémoire.

Y a-t-il d'autres scénarios à envisager ?

5voto

user88637 Points 2444

Quand utiliser un std::string c++ :

  • string sont, dans l'ensemble, plus sûrs que les char* Normalement, lorsque vous faites des choses avec char* il faut vérifier les choses pour s'assurer qu'elles sont correctes, dans les string classe, tout cela est fait pour vous.
  • En général, lorsque l'on utilise char* vous devrez libérer la mémoire que vous avez allouée, vous n'avez pas à le faire avec string puisqu'il libérera son tampon interne lors de sa destruction.
  • string fonctionnent bien avec c++ stringstream Il est très facile de mettre en place des IO formatées.

Quand utiliser les chars *

  • Utilisation char* vous permet de mieux contrôler ce qui se passe "en coulisses", ce qui signifie que vous pouvez ajuster les performances si nécessaire.

5voto

Nemanja Trifunovic Points 17239

Utilisez des char* (const) comme paramètres si vous écrivez une bibliothèque. Les implémentations de std::string diffèrent d'un compilateur à l'autre.

3voto

n0rd Points 2889

Si vous souhaitez utiliser des bibliothèques C, vous devrez utiliser des chaînes C. Il en va de même si vous souhaitez exposer votre API au langage C.

2voto

Vous pouvez vous attendre à ce que la plupart des opérations sur une std::string (comme par exemple find ) pour être aussi optimisés que possible, de sorte qu'ils sont susceptibles de fonctionner au moins aussi bien qu'un homologue en C pur.

Il est également intéressant de noter que les itérateurs std::string correspondent souvent à des pointeurs sur le tableau de caractères sous-jacent. Ainsi, tout algorithme conçu à partir d'itérateurs est essentiellement identique, en termes de performances, au même algorithme conçu à partir de char *.

Les points à surveiller sont, par exemple, les suivants operator[] - la plupart des implémentations STL n'effectuent pas de vérification des limites, et devraient traduire cette opération en la même opération sur le tableau de caractères sous-jacent. AFAIK STLPort peut optionnellement effectuer un contrôle des limites, auquel cas cet opérateur serait un peu plus lent.

Qu'est-ce que l'utilisation de std::string vous apporte ? Elle vous dispense de la gestion manuelle de la mémoire ; le redimensionnement du tableau devient plus facile, et vous devez généralement moins penser à libérer de la mémoire.

Si vous êtes préoccupé par les performances lors du redimensionnement d'une chaîne de caractères, il existe une fonction reserve que vous trouverez peut-être utile.

1voto

RvdK Points 10793

Si vous utilisez un tableau de caractères comme un texte, etc., utilisez std::string, plus flexible et plus facile à utiliser. Si vous l'utilisez pour autre chose, comme le stockage de données, utilisez des tableaux (préférez les vecteurs).

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