Ich habe in letzter Zeit einige notwendige Optimierungen vorgenommen. Eine Sache, die ich getan habe, ist, einige Ostringströme zu verändern -> Sprintfs. Ich sprinte ein paar Standard-Strings zu einem Array im Stil von AC, ala
char foo[500];
sprintf(foo, "%s+%s", str1.c_str(), str2.c_str());
Es stellt sich heraus, dass die Implementierung von Microsoft std :: string :: c_str () in konstanter Zeit ausgeführt wird (es wird nur ein interner Zeiger zurückgegeben). Es scheint, dass libstdc ++ dasselbe tut . Ich verstehe, dass der Standard keine Garantie für c_str gibt, aber es ist schwer, sich eine andere Art und Weise vorzustellen, dies zu tun. Wenn sie zum Beispiel in den Speicher kopiert werden, müssen sie entweder Speicher für einen Puffer zuweisen (es bleibt dem Aufrufer überlassen, ihn zu zerstören - NICHT Teil des STL-Vertrags) ODER sie müssen in eine interne statische Datei kopieren Puffer (wahrscheinlich nicht threadsicher, und Sie haben keine Garantie für seine Lebensdauer). Es scheint also die einzig realistische Lösung zu sein, einfach einen Zeiger auf eine intern gepflegte nullterminierte Zeichenfolge zurückzugeben.
c_str
es sich um eine const-Methode handelt (oder zumindest eine const-Überladung hat - ich vergesse welche), ändert dies den logischen Wert nicht und kann daher ein Grund dafür seinmutable
. Es würde Zeiger von anderen Aufrufen auf unterbrechenc_str
, mit der Ausnahme, dass sich solche Zeiger auf dieselbe logische Zeichenfolge beziehen müssen (es gibt also keinen neuen Grund für eine Neuzuweisung - es muss bereits ein Nullterminator vorhanden sein), oder es muss bereits ein Aufruf an einen Nicht-Benutzer stattgefunden haben -const Methode dazwischen.