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

VB.NET: Raise base class events from a derived class

Apache Kafka - I - High level architecture and concepts

Upgrading Lodash from 3.x to 4.x