2011-03-30 19 views
48

Estaba escuchando un lenguaje google talk by Andrei Alexandrescu on the D programming cuando lanzó un trazador de líneas sobre el fiasco "endl". Solo pensé que endl era la forma preferida de indicar el final de una línea y eliminar el buffer de una transmisión. ¿Por qué se considera un fiasco? ¿No debería usarlo en mi código?¿Qué es el fiasco C++ iostream endl?

+3

Post-it! ¡Publícalo! –

+1

@ildjarn: Estás 100% en lo cierto. ¡Sabía que vacia los búfers y aún perdió ~ 75 puntos en [CEOI 2008] (http://ceoi2008.de/en/welcome) para eso! ¡Malos hábitos! – ybungalobill

+1

@ildjarn Mi profesor insiste en que usemos 'std :: endl' para todo en lugar de' \ n', lo cual, estoy de acuerdo, es bastante extraño. Pero, de nuevo, solo estamos escribiendo programas de consola simples. Pero, de nuevo otra vez, parece que piensa inicializando un (POD) variable en un bucle es un problema potencial de rendimiento ... – Maxpm

Respuesta

69

Traspaso de mi comentario:

(supongo) Simplemente significa que muchos, especialmente los nuevos, C++ programadores utilizan std::endl ciegamente en lugar de '\n' para la nueva línea, rubor innecesariamente frecuente y potencialmente lo que el rendimiento de su programa abismal.

es decir, la mayoría de las personas se les enseña que es std::endlla forma canónica para insertar un salto de línea en una corriente a pesar de que es muy rara vez necesario o apropiado para tirar de la cadena.

Es la opinión de algunas personas (* tos *) que std::endl ni siquiera debería estar en la norma, ya que es tan rara apropiado y no un ahorro significativo de escritura sobre '\n' << std::flush de todos modos.


TL; DR (s) :

  • Al final, std::endl se compra nada, excepto generalmente peor rendimiento y por lo general más escribir.
  • Tiene sus usos, pero son considerablemente menos frecuentes de lo que su frecuencia de uso sugiere en la mayoría de las grandes bases de código, por lo tanto ...
  • Su utilidad es muy cuestionable y su ubicuidad es absurda, ¡un verdadero fiasco!
+2

Es realmente realmente un problema si su programa realiza muchas E/S basadas en flujo. – dreamlax

+43

yo sepa algunas personas lo utilizan pensando que es el camino "plataforma neutral" para insertar un salto de línea, sin saber que \ n '** ** es el salto de línea en C, y que la conversión terminador \ n'-> plataforma de línea específica '' es manejado por la corriente. –

+6

¿Estamos hablando de una optimización prematura aquí? Es bueno tener una cosilla de línea de extremo simple de usar para su salida. Especialmente si está aprendiendo el idioma y no ve inmediatamente lo que '\ n' haría por el resultado. ¡Después de haber aprendido a crear un perfil de su código, puede considerar otras opciones! –

Cuestiones relacionadas