¿Utilizando un manipulador de flujo (endl) o un carácter de escape de nueva línea (\ n)?

13

No tengo un contexto específico en el que formule la pregunta, pero cuando estaba leyendo un libro para principiantes en C ++, noté el uso de un manipulador de flujo endl y un personaje de escape de nueva línea cuando trato con un flujo objeto.

El ejemplo es el siguiente:

cout << "Hello World" << endl;
cout << "Hello World\n";

Mis preguntas son:

  1. ¿Es más apropiado usar el manipulador de flujo (endl) en un determinado ¿Una situación y un personaje de escape en otro diferente?
  2. ¿Hay inconvenientes en cuanto a la eficiencia al usar uno de los dos?
  3. ¿Son completamente intercambiables?
  4. Leí que una secuencia de escape se almacena en la memoria como un solo carácter. ¿Eso significa que es más apropiado usar endl si va a consumir poca memoria?
  5. ¿El manipulador de flujo usa la memoria de alguna manera, si es así, es más que la secuencia de escape?

Gracias, StackExchange Disculpas si publiqué esto en la sección incorrecta, pensé que contaba como estructuras de datos.

    
pregunta Nathan Taylor 28.01.2013 - 16:26

2 respuestas

13

o << std::endl es equivalente al siguiente código:

o.put(o.widen('\n'));
o.flush();

En otras palabras, solo debe usar std::endl cuando necesite vaciar la secuencia. Por ejemplo:

  • Estás a punto de realizar una operación que consume mucho tiempo y quieres asegurarte de mostrar un mensaje antes de hacerlo.
  • Otro proceso está esperando en tu salida.
  • Si se está ejecutando más de un subproceso o proceso, es posible que deba vaciar la salida para que la salida de cada subproceso o proceso se muestre correctamente. (De lo contrario, puede obtener bloques de salida aparentemente aleatorios intercalados a intervalos incómodos).

Si no necesita para vaciar la transmisión, use \n en lugar de std::endl . Las llamadas adicionales a flush pueden perjudicar el rendimiento (a veces significativamente).

Para obtener más detalles, consulte cppreference.com .

Respecto al uso de la memoria: preocuparse por \n versus std::endl es casi una microoptimización innecesaria, pero en general, esperaría que \n tome menos memoria. \n es solo un byte más al final de un literal de cadena, mientras que el compilador traduce std::endl en llamadas de función (probablemente en línea) a put y flush .

Las diferencias específicas de la plataforma en los finales de línea (Windows \r\n frente a Linux y OS X \n ) se manejan a un nivel más bajo que std::endl y \n :

  • Si una secuencia se abre en modo de texto, entonces si escribe \n , se traduce automáticamente al final de línea correspondiente a la plataforma correspondiente. Si lees un final de línea específico de la plataforma, la secuencia se traduce automáticamente a \n .
  • Si una secuencia se abre en modo binario, entonces pasan cualquier final de línea a través de textualmente, y depende de usted.
  • En particular, para std::cout y std::cin , se tratan como si estuvieran en modo texto.
respondido por el Josh Kelley 28.01.2013 - 17:18
1

1) Para portabilidad, use endl . Las nuevas líneas de Windows son \r\n , Linux \n y Mac \r . Edición: Según los comentarios, los finales específicos del sistema de línea se manejan a un nivel inferior.

2) endl vacía la transmisión, "\n" no lo hace.

3) Depende de la portabilidad.

En cuanto al uso de la memoria, puede minimizarlo descargando a otro almacenamiento con la mayor frecuencia posible con endl . Sin embargo, disminuirá el rendimiento.

Editar: aclarar algunos errores.

    
respondido por el Kent 28.01.2013 - 16:42

Lea otras preguntas en las etiquetas