char * vs std :: ssortingng dans c ++

Quand devrais-je utiliser std::ssortingng et quand devrais-je utiliser char* pour gérer les tableaux de caractères dans C ++?

Il semble que vous deviez utiliser char* si la performance (rapidité) est cruciale et que vous êtes prêt à accepter certaines activités risquées en raison de la gestion de la mémoire.

Y a-t-il d’autres scénarios à considérer?

Vous pouvez passer std :: ssortingngs par référence si elles sont grandes pour éviter la copie, ou un pointeur sur l’instance, donc je ne vois aucun avantage réel à utiliser des pointeurs de caractères.

J’utilise std :: ssortingng / wssortingng pour plus ou moins tout ce qui est du texte. char * est utile pour d’autres types de données et vous pouvez être sûr qu’il sera libéré comme il se doit. Sinon, std :: vector est la voie à suivre.

Il y a probablement des exceptions à tout cela.

Mon sharepoint vue est le suivant:

  • N’utilisez jamais le caractère * si vous n’appelez pas le code “C”.
  • Toujours utiliser std :: ssortingng: c’est plus facile, c’est plus convivial, il est optimisé, c’est standard, cela vous évitera d’avoir des bogues, il a été vérifié et a fait ses preuves.

Utilisation de la chaîne brute

Oui, parfois vous pouvez vraiment le faire. Lorsque vous utilisez const char *, des tableaux de caractères alloués sur la stack et des chaînes littérales, vous pouvez le faire de manière à ce qu’il n’y ait aucune allocation de mémoire.

L’écriture d’un tel code nécessite souvent plus de reflection et d’attention que l’utilisation de chaînes ou de vecteurs, mais avec des techniques appropriées, cela peut être fait. Avec les techniques appropriées, le code peut être sûr, mais vous devez toujours vous assurer que lors de la copie dans char [], vous avez des garanties sur la longueur de la chaîne à copier ou que vous vérifiez et gérez gracieusement les chaînes surdimensionnées. Ce n’est pas ce qui a donné à la famille de fonctions strcpy la réputation d’être dangereuse.

Comment les modèles peuvent aider à écrire des tampons de caractères sûrs

En ce qui concerne la sécurité des tampons char [], les modèles peuvent vous aider, car ils peuvent créer une encapsulation pour gérer la taille de la mémoire tampon pour vous. Des modèles comme celui-ci sont mis en œuvre par exemple par Microsoft pour fournir des remplacements sécurisés pour strcpy. L’exemple ici est extrait de mon propre code, le code réel a beaucoup plus de méthodes, mais cela devrait suffire à transmettre l’idée de base:

 template  class BSsortingng { char _data[Size]; public: BSsortingng() { _data[0]=0; // note: last character will always stay zero // if not, overflow occurred // all constructors should contain last element initialization // so that it can be verified during destruction _data[Size-1]=0; } const BSsortingng &operator = (const char *src) { strncpy(_data,src,Size-1); return *this; } operator const char *() const {return _data;} }; //! overloads that make conversion of C code easier template  inline const BSsortingng & strcpy(BSsortingng &dst, const char *src) { return dst = src; } 

Vous devriez envisager d’utiliser char* dans les cas suivants:

  • Ce tableau sera passé en paramètre.
  • Vous connaissez à l’avance la taille maximale de votre tableau (vous le savez ou vous l’imposez).
  • Vous ne ferez aucune transformation sur ce tableau.

En fait, en C ++, char* est souvent utilisé pour les petits mots fixes, comme options, nom de fichier, etc.

Une fois que vous DEVEZ utiliser char* et non std::ssortingng c’est lorsque vous avez besoin de constantes de chaîne statiques. La raison en est que vous n’avez aucun contrôle sur les modules d’initialisation de l’ordre des variables statiques, et qu’un autre object global provenant d’un module différent peut faire référence à votre chaîne avant son initialisation. http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Static_and_Global_Variables

std::ssortingng pros:

  • gère la mémoire pour vous (la chaîne peut croître, et l’implémentation vous allouera un plus grand tampon)
  • Interface de programmation de niveau supérieur, fonctionne bien avec le rest de STL.

std::ssortingng contre: – deux instances de chaîne STL distinctes ne peuvent pas partager le même tampon sous-jacent. Donc, si vous passez par valeur, vous obtenez toujours une nouvelle copie. – Il y a une pénalité de performance, mais je dirais que si vos exigences sont particulières, c’est négligeable.

Quand utiliser un c ++ std :: ssortingng:

  • Les chaînes, dans l’ensemble, sont plus sécurisées que char *. Normalement, lorsque vous faites des choses avec char *, vous devez vérifier les choses pour vous assurer que tout va bien. Dans la classe de chaînes, tout est fait pour vous.
  • Habituellement, lorsque vous utilisez char *, vous devrez libérer la mémoire que vous avez allouée, vous n’avez pas à faire cela avec de la chaîne, car cela libérerait son tampon interne une fois détruit.
  • Les chaînes fonctionnent bien avec c ++ ssortingngstream, les IO formatées sont très faciles.

Quand utiliser char *

  • Utiliser char * vous donne plus de contrôle sur ce qui se passe “derrière” les scènes, ce qui signifie que vous pouvez ajuster les performances si vous en avez besoin.

Utilisez (const) char * comme parameters si vous écrivez une bibliothèque. Les implémentations std :: ssortingng diffèrent entre les différents compilateurs.

Si vous souhaitez utiliser les bibliothèques C, vous devrez gérer les chaînes de caractères. La même chose s’applique si vous souhaitez exposer votre API à C.

Vous pouvez vous attendre à ce que la plupart des opérations sur un std :: ssortingng (comme par exemple find ) soient aussi optimisées que possible, de sorte qu’elles sont probablement aussi performantes qu’un équivalent C pur.

Il convient également de noter que les iterators std :: ssortingng sont souvent associés à des pointeurs dans le tableau de caractères sous-jacent. Ainsi, tout algorithme que vous concevez en plus des iterators est essentiellement identique au même algorithme en plus de char * en termes de performances.

Les éléments à surveiller sont par exemple operator[] – la plupart des implémentations STL n’effectuent pas de vérification des limites et devraient traduire cette opération par la même opération sur le tableau de caractères sous-jacent. AFAIK STLPort peut éventuellement effectuer une vérification des limites, à quel point cet opérateur serait un peu plus lent.

Alors, comment utiliser std :: ssortingng pour gagner? Il vous dispense de la gestion manuelle de la mémoire; redimensionner le tableau devient plus facile et vous devez généralement moins penser à libérer de la mémoire.

Si vous êtes inquiet au sujet des performances lors du redimensionnement d’une chaîne, il existe une fonction de reserve que vous pouvez trouver utile.

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

Même lorsque les performances sont cruciales, mieux vaut utiliser vector – cela permet une allocation de mémoire en avance (méthode reserve ()) et vous aidera à éviter les memory leaks. Utiliser vector :: operator [] conduit à une surcharge, mais vous pouvez toujours extraire l’adresse du tampon et l’indexer exactement comme s’il s’agissait d’un char *.

AFAIK en interne la plupart des std :: ssortingng implémentent la copie en écriture, référence la sémantique comptée pour éviter la surcharge, même si les chaînes ne sont pas passées par référence.