En un proyecto mío en C++ estoy un paso antes de reemplazar todo char*
con std::string
pero encuentro una cierta ocasión en la que std::string
falla miserablemente.Cadena C++ no optimizada lo suficiente para literales de cadena
Imagínese que tengo estas 2 funciones:
void foo1(const std::string& s)
{
...
}
void foo2(const char* s)
{
...
}
Si escribo algo como esto:
const char* SL = "Hello to all!";
foo1(SL); // calls malloc, memcpy, free
foo2(SL);
en foo1
la SL
implícitamente convertido en std::string
. Esto significa que el constructor std::string
asignará memoria y se copiará la cadena literal a ese búfer. En foo2
aunque nada de todo esto sucederá.
En la mayoría de las implementaciones std::string
se supone que es súper optimizado (copiar al escribir, por ejemplo), pero cuando se construyo con un const char*
no lo es. Y mi pregunta es esta: ¿Por qué sucede esto? ¿Me estoy perdiendo de algo? ¿Mi biblioteca estándar no está optimizada lo suficiente o por alguna razón (de la que no tengo conocimiento) esto es totalmente inseguro?
Copiar en escritura no es realmente una "súper optimización". Creo que la biblioteca estándar de GCC todavía lo usa, pero solo porque tenía sentido hace 10 años, antes de que la norma fuera el multihilo. Una implementación sensata de la biblioteca hecha hoy evitaría la VACA como la peste. – jalf
Creo que el estándar ni siquiera permite COW debido a los requisitos de invalidación del iterador de las funciones miembro. – Xeo
Afaik C++ 03 permitido VACA. Creo que C++ 11 lo prohíbe – jalf