Tengo entendido que la única diferencia entre las dos formas de hacer una nueva línea, es que la primera además, vacía el buffer de salida. ¿Podrían mostrarme un ejemplo práctico donde se vea la diferencia en usar uno y otro?
-
1Prácticamente es solo en determinados casos donde obtienes la diferencia de uno y otro, dado que el rendimiento no es el mismo, es decir, no es lo mismo finalizar un string con un caracter mas (`'\n'`) que llamar a `ostream` solo por imprimir un salto de linea. Lo que deja tu pregunta resuelta en su formulación. En teoría _(porque no lo he probado)_ la diferencia entre `std::endl` y `'\n'` es de milésimas de segundo. – NaCl Jun 24 '16 at 17:38
-
Gracias por la respuesta, aunque puede ser que la haya formulado incorrectamente. No hablo sobre cuál de la dos es más efectiva en cuanto a rendimiento, sino, hay algún caso donde usar una otra arroje diferentes resultados? Algún ejemplo donde se pueda ver esa diferencia? – user2763052 Jun 24 '16 at 17:42
1 Answers
Tomado de aquí y de aquí, explicando lo siguiente:
El '\n'
es un caracter que, llamado "salto de línea" o "lone feed", está representado por parecer null, pero solo posiciona el cursor en una nueva linea para seguir escribiendo.
Mientras que std::endl
es el equivalente a: std::cout << "\n" << std::flush
.
Sus diferencias son estrictamente obvias, dado que llamar al caracter \n
solo involucra concatenar un solo string, pero al hacer uso de std::endl
se llama a una limpieza del buffer (que contesta tu pregunta).
Los casos donde se pueden utilizar, probemos con el código del primer link:
#include <string>
#include <iostream>
int main() {
std::string s(1, 'x');
for (int i = 0; i < 1000000; ++i) {
std::cout << s << std::endl;
}
return 0;
}
Con las siguientes configuraciones:
clang++ -o endl -O3 endl.cpp && time ./endl >rubbish
Arroja los siguientes resultados:
real 0m4.518s
user 0m1.080s
sys 0m3.311s
Mientras que el mismo código solo con el escape:
#include <string>
#include <iostream>
int main() {
std::string s(1, 'x');
for (int i = 0; i < 1000000; ++i) {
std::cout << s << '\n';
}
return 0;
}
Y las mismas configuraciones:
clang++ -o endl -O3 endl.cpp && time ./endl >rubbish
Produce estos resultados:
real 0m0.263s
user 0m0.236s
sys 0m0.008s
Los tiempos de respuesta son mucho más efectivos dado que no se "exige" que se limpie el buffer.
Esto, claro en un caso hipotetico donde no necesites limpiar el buffer de salida, pero como menciono anteriormente, no hay basta diferencia entre ambos, siempre se imprimirá un caracter de escape \n
para la nueva linea. Lo que deja un último detalle: La unica diferencia es rendimiento.
Espero te ayude.
- 6,702
- 4
- 26
- 50
-
1Excelente respuesta, muchas gracias. Una última consulta. En qué casos es necesario limpiar el buffer de salida? No se si corresponde publicarlo acá o hacer una nueva pregunta. – user2763052 Jun 24 '16 at 18:09
-
1
-
4@user2763052 Tomalo de la siguiente manera, imagina que tienes un programa que lee un archivo de mas de 500,000 lineas, pero tienes una memoria limitada, no puedes leer las 500,000 de golpe, sino que lees las primeras 50,000, luego limpias el buffer de entrada y de salida para poder cargar las siguientes 50,000 lineas y así sucesivamente hasta terminar. – NaCl Jun 24 '16 at 18:17
-
1
-
Una consulta, el llamado "retorno de carro" no es el caracter `\r`? Según tengo entendido, al caracter `\n` se le llama "nueva línea". – Xam Dec 29 '17 at 20:15
-
1