He estado haciendo algunas optimizaciones necesarias últimamente. Una cosa que he estado haciendo es cambiar algunos ostringstreams -> sprintfs. Estoy corriendo un montón de std :: strings a ac style array, ala
char foo[500];
sprintf(foo, "%s+%s", str1.c_str(), str2.c_str());
Resulta que la implementación std :: string :: c_str () de Microsoft se ejecuta en tiempo constante (solo devuelve un puntero interno). Parece que libstdc ++ hace lo mismo . Me doy cuenta de que el estándar no ofrece garantías para c_str, pero es difícil imaginar otra forma de hacerlo. Si, por ejemplo, copiaran en la memoria, tendrían que asignar memoria para un búfer (dejando que la persona que llama lo destruya, NO es parte del contrato STL) O tendrían que copiar a una estática interna buffer (probablemente no es seguro para subprocesos, y no tiene garantías de por vida). Entonces, simplemente devolver un puntero a una cadena terminada en nulo mantenida internamente parece ser la única solución realista.
c_str
es un método constante (o al menos tiene una sobrecarga constante, no recuerdo cuál), esto no cambia el valor lógico, por lo que puede ser una razónmutable
. Se podría romper punteros de otras llamadas ac_str
, salvo que cualquiera de estos indicadores deben referirse a la misma cadena lógica (lo que no hay nueva razón para reasignar - ya debe haber un terminador nulo) o de lo contrario debe haber sido una llamada a un no -const método en el medio.