Ultimamente ho fatto alcune ottimizzazioni necessarie. Una cosa che ho fatto è cambiare alcuni flussi di ostrings -> sprintfs. Sto scattando un mucchio di stringhe std :: string a array in stile ac, ala
char foo[500];
sprintf(foo, "%s+%s", str1.c_str(), str2.c_str());
Si scopre che l'implementazione std :: string :: c_str () di Microsoft viene eseguita in tempo costante (restituisce solo un puntatore interno). Sembra che libstdc ++ faccia lo stesso . Mi rendo conto che lo std non fornisce garanzie per c_str, ma è difficile immaginare un altro modo di farlo. Se, per esempio, avessero copiato in memoria, avrebbero dovuto allocare memoria per un buffer (lasciandolo al chiamante per distruggerlo - NON parte del contratto STL) O avrebbero dovuto copiare su un statico interno buffer (probabilmente non thread-safe, e non hai garanzie sulla sua durata). Quindi semplicemente restituire un puntatore a una stringa terminata null mantenuta internamente sembra essere l'unica soluzione realistica.
c_str
è un metodo const (o almeno ha un sovraccarico const - dimentico quale), questo non cambia il valore logico, quindi potrebbe essere un motivomutable
. Si sarebbe rompere puntatori da altre chiamate ac_str
, salvo che tali indicatori devono fare riferimento alla stessa stringa di logica (quindi non c'è alcun nuovo motivo per riallocare - ci deve essere già un terminatore null) altrimenti non ci deve essere già stato una chiamata a un non -const metodo nel mezzo.