¿Hay alguna diferencia entre cadenas + -ing y << - cadenas de ING en c ++?
-
05-09-2019 - |
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";
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.