Natürlich kann die std::string-Objekte so langsam wie möglich verwenden, wenn man diese bei Funktionsaufrufen kopiert, statt per Referenz zu übergeben. CStrings wären jedoch genau so langsam, wenn man diese vor jedem Funktionsaufruf kopierte (Länge ermitteln, Speicher alloziieren, kopieren).
Nein, das hat damit wirklich nichts zu tun... die std::strings sind bei sehr großen Zeichenketten ziemlich träge. Das liegt unteranderem daran, dass diese Klasse nicht ganz dem Konzept eines Strings entspricht. So sind Strings in jeder anderen Sprache Java, C#, D... anders aufgebaut. Ein String sollte sich selbst nämlich nicht manipulieren und verändern dürfen, sondern sollte immer einen konstanten nicht veränderbaren Wert haben. Anstatt den eigenen String zu verändern sollte nämlich ein neuer erzeugt werden. So aber liegen die Strings in C++ anderen Implementierungen andere sprachen sehr hinterher:
http://d-programming-language.org/cppstrings.html
In seinem Fall sollte das natürlich nicht von Nachteil sein, aber wenn man mal mit 2GB großen Zeichenketten zu tun haben sollte...