Ultimamente, tenho feito algumas otimizações necessárias. Uma coisa que venho fazendo é mudar alguns fluxos de ostring -> sprintfs. Estou correndo um monte de std :: strings para uma matriz de estilo ac, ala
char foo[500];
sprintf(foo, "%s+%s", str1.c_str(), str2.c_str());
Acontece que a implementação std :: string :: c_str () da Microsoft é executada em tempo constante (apenas retorna um ponteiro interno). Parece que libstdc ++ faz o mesmo . Sei que o std não garante o c_str, mas é difícil imaginar outra maneira de fazer isso. Se, por exemplo, eles copiassem para a memória, teriam que alocar memória para um buffer (deixando o chamador destruí-lo - NÃO faz parte do contrato STL) OU teriam que copiar para uma estática interna buffer (provavelmente não é seguro para threads e você não tem garantias de vida útil). Portanto, simplesmente retornar um ponteiro para uma sequência terminada nula mantida internamente parece ser a única solução realista.
c_str
seja um método const (ou pelo menos tenha uma sobrecarga const - eu esqueço qual), isso não altera o valor lógico, portanto pode ser uma razão para issomutable
. Ele iria quebrar ponteiros de outras chamadas parac_str
, a não ser que tais indicações devem referir-se a mesma seqüência lógica (então não há nenhuma nova razão para realocar - já deve ser um terminador nulo) ou então há já deve ter sido uma chamada para um não -const no meio.