Saya telah melakukan beberapa optimasi yang dibutuhkan belakangan ini. Satu hal yang telah saya lakukan adalah mengubah beberapa ostringstreams -> sprintfs. Saya sprintf'ing banyak std :: string ke ac style array, ala
char foo[500];
sprintf(foo, "%s+%s", str1.c_str(), str2.c_str());
Ternyata implementasi std :: string :: c_str () Microsoft berjalan dalam waktu konstan (hanya mengembalikan pointer internal). Tampaknya libstdc ++ melakukan hal yang sama . Saya menyadari std tidak memberikan jaminan untuk c_str, tetapi sulit membayangkan cara lain untuk melakukan ini. Jika, misalnya, mereka menyalin ke dalam memori mereka juga harus mengalokasikan memori untuk buffer (menyerahkannya kepada pemanggil untuk menghancurkannya - BUKAN bagian dari kontrak STL) ATAU mereka harus menyalin ke statis internal buffer (mungkin bukan threadsafe, dan Anda tidak memiliki jaminan seumur hidup). Jadi hanya mengembalikan pointer ke string yang diakhiri dengan null yang dipelihara secara internal tampaknya menjadi satu-satunya solusi yang realistis.
c_str
metode const (atau setidaknya memiliki overload const - saya lupa yang mana), ini tidak mengubah nilai logis, jadi mungkin merupakan alasan untuk itumutable
. Ini akan memecah pointer dari panggilan lain kec_str
, kecuali bahwa setiap pointer tersebut harus merujuk ke string logis yang sama (jadi tidak ada alasan baru untuk realokasi - pasti sudah ada terminator nol) atau ada harus sudah ada panggilan ke non Metode -const di antara keduanya.