Pregunta

¿Cuál es la diferencia, si la hay entre los efectos de los siguientes fragmentos:

cout << "Some text" << s1 << "some more text\n";

cout << "Some text" + s1 + "some more text\n";
¿Fue útil?

Solución

El resultado del operador + en las cuerdas es una nueva cadena. Por lo tanto, en el ejemplo

cout << "Some text" + s1 + "some more text\n";

dos nuevas cadenas se crean (implica la asignación de memoria), antes de todo esto está escrito a cout. En el primer ejemplo, todo lo que se escribe directamente a cout sin asignación de memoria innecesaria.

Otros consejos

Tenga en cuenta lo siguiente:

cout << "Some text" + " " + "some more text\n";

No va a hacer lo que usted piensa. Operador + no siempre significa concatenar.

Editar: Cuando se aplica a las cadenas primas, el operador + no concatenar - que añade las direcciones de los punteros a las cadenas. El resultado es casi seguro que un disparate, porque apunta a un área de memoria que no tiene relación con ninguna de las cadenas originales. Con suerte que se colgará su programa.

Editar 2: Al parecer, ha sido un largo tiempo desde que hice este error. Los resultados son tan sin sentido de que el compilador se niega a compilarlo.

Sí, string operator+ (const char* lhs, const string& rhs) crea y devuelve un objeto no identificado cadena temporal.

cout << "Some text" llama ostream y ostream :: operador << (const char * const) y devuelve la referencia ostream.

cout << "Some text" << s1 << "some more text\n";

es ostream::operator<<( "Some text").operator<<(s1).operator<<("some more text\n"), tres llamadas en cout, llamando a dos sobrecargas diferentes de op <<, el op << que lleva un const* char* const y el op << que lleva un const string&. No hay asignaciones de memoria, y la única copia es para el buffer del cout.

cout << "Some text" + s1 + "some more text\n";

es ostream::operator<<(t1) en un objeto de cadena temporal que llamaré t1 , que T1 es el resultado temporal de ::operator+ ( "Some text", s1).operator+("some more text\n"). (Tenga en cuenta que el primer operador + no es miembro de la cadena, pero el op + (const char * const, const string y) al ámbito del espacio de nombres. Se devuelve una cadena, por lo que la segunda +" es string :: operator + (const char * const) .)

Así se crean dos objetos de cadena temporales (y luego destruidos), en este código. Eso significa dos representaciones internas de las cadenas (por lo que dos asignaciones de memoria) y dos copias que dos de reciente memoria asignada (además de la copia de la memoria intermedia del cout).

El segundo concatena las cadenas antes de enviarlas a cout, que es un impacto en el rendimiento, potencialmente muy grande con grandes cadenas. Uno siempre quiere utilizar la primera forma si es posible.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top