Lo que dicen en el texto que has leído es correcto y puedes leerlo también en cualquier documentación de std::endl
:
Insert newline and flush
Inserts a new-line character and flushes the stream.
Its behavior is equivalent to calling os.put('\n')
(or os.put(os.widen('\n'))
for character types other than char
), and then os.flush()
.
En castellano:
Inserta una nueva línea y vacía la memoria temporal
Inserta un carácter de nueva línea y vacía la memoria temporal del flujo de datos.
Su comportamiento es equivalente a llamar a os.put('\n')
(o os.put(os.widen('\n'))
para tipos de caracteres diferentes de char
), y después a os.flush()
.
Hay que tener en cuenta que el sistema operativo implementa de diferente manera el flujo de datos que da salida al terminal del usuario que la salida a un flujo de datos a un archivo, una tubería hacia otra aplicación, etc.
De modo que en una aplicación normal con salida directa al terminal no podrías comprobar la diferencia entre vaciar la memoria temporal del flujo de datos y no hacerlo.
Para mostrarte la diferencia voy a usar el siguiente código:
#include <iostream>
#ifdef _WIN32
#include <windows.h>
#else
#include <unistd.h>
#define Sleep(t) usleep(t * 1000000)
#endif // _WIN32
int main() {
std::cout << "Comienzo" << std::endl;
for (int i = 1; i <= 3; i++) {
std::cout << "Iteración: " << i << "\n";
Sleep(1);
}
for (int i = 1; i <= 3; i++) {
std::cout << "Iteración: " << i << std::endl;
Sleep(1);
}
std::cout << "Fin" << std::endl;
}
Al ejecutar el código normalmente (./pruebas
) estamos enviando la salida estándar al terminal del usuario. No habrá ninguna diferencia entre usar std::endl
o no porque el sistema operativo vaciará automáticamente la memoria temporal (buffer) en cuanto se encuentre un retorno del carro (\n
).
Al ejecutar la aplicación enviando su salida a una tubería a una segunda aplicación (./pruebas | more
) el sistema operativo no hará un vaciado automático la memoria temporal (buffer) al encontrar el carácter de retorno del carro, por lo que durante la impresión de las primeras tres iteraciones no aparecerá nada por pantalla porque todo se almacena en una memoria temporal de la corriente de datos que no se enviará a more
para ser mostrado en el terminal del usuario hasta que se ejecute el primer std::endl
.
Puedes ver aquí el efecto anteriormente explicado:
¿Qué ventajas o usos tienen "\n"
y std::endl
?