C++: std:endl VS n

publicado por: Anonymous

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?

solución

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.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *