J'ai fait quelques optimisations nécessaires récemment. Une chose que j'ai faite est de changer certains ostringstreams -> sprintfs. Je sprintf'ing un tas de chaînes std :: strings to ac style array, ala
char foo[500];
sprintf(foo, "%s+%s", str1.c_str(), str2.c_str());
Il s'avère que l'implémentation std :: string :: c_str () de Microsoft s'exécute en temps constant (elle renvoie simplement un pointeur interne). Il semble que libstdc ++ fasse de même . Je me rends compte que le std ne fait aucune garantie pour c_str, mais il est difficile d'imaginer une autre façon de procéder. Si, par exemple, ils copiaient dans la mémoire, ils devaient soit allouer de la mémoire pour un tampon (laissant à l'appelant le soin de le détruire - NE FAIT PAS partie du contrat STL) OU ils devaient copier sur un statique interne tampon (probablement pas threadsafe, et vous n'avez aucune garantie sur sa durée de vie). Donc, le simple retour d'un pointeur vers une chaîne terminée par un null maintenu en interne semble être la seule solution réaliste.
c_str
c'est une méthode const (ou au moins a une surcharge const - j'oublie laquelle), cela ne change pas la valeur logique, donc cela peut être une raisonmutable
. Il serait briser des pointeurs d' autres appels àc_str
, sauf que de tels pointeurs doivent se référer à la même chaîne logique (donc il n'y a pas de nouvelle raison de réallouer - il doit déjà être un terminateur nul) ou bien il doit avoir été un appel à un non -const méthode entre les deux.