Ultimamente ho fatto alcune ottimizzazioni necessarie. Una cosa che ho fatto è cambiare alcuni stream di ostrings - > sprintfs. Sto sprintf'ing un gruppo di std :: stringhe in un array in stile c, ala
char foo[500];
sprintf(foo, "%s+%s", str1.c_str(), str2.c_str());
Si scopre che l'implementazione di Microsoft std :: string :: c_str () viene eseguita in tempo costante (restituisce semplicemente un puntatore interno). Sembra che libstdc ++ faccia lo stesso . Mi rendo conto che std non offre garanzie per c_str, ma è difficile immaginare un altro modo per farlo. Se, ad esempio, copiavano in memoria, dovevano allocare memoria per un buffer (lasciandolo al chiamante per distruggerlo - NON fa parte del contratto STL) O dovevano copiare su un file statico interno buffer (probabilmente non a prova di thread, e non hai garanzie sulla sua durata). Quindi semplicemente restituire un puntatore a una stringa terminata da null internamente mantenuta sembra essere l'unica soluzione realistica.