C++: std::endl versus \n

Releyendo la biblia del programador C++, noté algo que en su momento se me pasó por alto. Lo que sigue es el Hola Mundo del libro:

int main()
{
   std::cout << "Hello, World!\n";
}

¿Por qué Bjarne usa \n en vez de std::endl? ¿Acaso no nos enseñaron que std::endl es más portable, ya que pone \n en *ix y \r\n en Ventanas?

La respuesta es que pese a ser portable, std::endl induce un flush del stream. ¿Qué significa esto? El software de aplicación, el sistema operativo e incluso el hardware hacen buffering, vale decir que no envían los datos al stream inmediatamente: los acumulan en un buffer hasta que el mismo se llene, momento en el que se efectúa el flush. Esto reduce los accesos a disco, lo cual siempre es deseable en términos de eficiencia.

En el Hola mundo la diferencia es despreciable, pero si tuviéramos un ciclo que escribiera muchas líneas a un archivo, la diferencia en performance puede manifestarse.

Ergo, usaremos std::endl cuando prioricemos la portabilidad sobre la eficiencia. Como siempre, lo que prioricemos dependerá de los requerimientos de nuestra aplicación.

Comments

Popular posts from this blog

Upgrading Lodash from 3.x to 4.x

C++/CLI: Trigger events from C++ native code and handle them in Managed code, Part I

Traduciendo un custom control de Windows Forms de VB.NET a C#