Tout ce qui suit est ce que ferait un compilateur naïf. Bien sûr, tant que cela ne change pas le comportement du programme, le compilateur est libre de faire n'importe quelle optimisation.
string a;
a = "hello!";
D'abord, vous initialisez a pour contenir la chaîne vide. (Définissez la longueur sur 0 et une ou deux autres opérations). Ensuite, vous affectez une nouvelle valeur, écrasant la valeur de longueur déjà définie. Il peut également avoir à effectuer une vérification pour voir quelle est la taille du tampon actuel, et si oui ou non plus de mémoire doit être allouée.
string *a;
a = new string("hello!");
...
delete(a);
L'appel à nouveau nécessite l'OS et l'allocateur de mémoire pour trouver un morceau de mémoire libre. C'est lent. Ensuite, vous l'initialisez immédiatement, donc vous n'attribuez rien deux fois ou vous avez besoin de redimensionner le tampon, comme vous le faites dans la première version. Puis quelque chose de mal arrive, et vous oubliez d'appeler supprimer, et vous avez une fuite de mémoire, en plus à une chaîne qui est extrêmement lent à allouer. Donc c'est mauvais. Comme dans le premier cas, vous initialisez d'abord a pour contenir la chaîne vide. Ensuite, vous affectez une nouvelle chaîne, puis une autre. Chacun de ces peut nécessiter un appel à new pour allouer plus de mémoire. Chaque ligne nécessite également une longueur, et éventuellement d'autres variables internes à affecter.
Normalement, vous auriez allouer comme ceci:
string a = "hello";
Une ligne, effectuez l'initialisation une fois, plutôt que par défaut la première-initialisation, puis attribuer la valeur que vous voulez.
Il réduit également les erreurs, car vous n'avez aucune chaîne vide absurde dans votre programme. Si la chaîne existe, elle contient la valeur que vous voulez. A propos de la gestion de la mémoire, google RAII. En résumé, string appelle new/delete en interne pour redimensionner son buffer. Cela signifie que jamais besoin d'allouer une chaîne avec new. L'objet chaîne a une taille fixe et est conçu pour être alloué sur la pile, de sorte que le destructeur soit automatiquement appelé lorsqu'il est hors de portée. Le destructeur garantit alors que toute mémoire allouée est libérée. De cette façon, vous n'avez pas besoin d'utiliser new/delete dans votre code utilisateur, ce qui signifie que vous ne perdrez pas de mémoire.
Utilisez-vous une classe de chaînes spécifique, ou simplement des chaînes normalisées à terminaison nulle? – tsellon
Je suppose que la question concerne std :: string. – rmeador