No tengo un contexto específico en el que estoy haciendo la pregunta, pero mientras leía un libro para principiantes en C ++ noté el uso de un manipulador de flujo endl y un carácter de escape de nueva línea cuando se trata de un objeto de flujo.
El ejemplo es el siguiente:
cout << "Hello World" << endl;
cout << "Hello World\n";
Mis preguntas son:
- ¿Es más apropiado usar el manipulador de flujo (endl) en una situación determinada y un personaje de escape en una diferente?
- ¿Existen inconvenientes en cuanto a eficiencia al usar uno de los dos?
- ¿Son completamente intercambiables?
- Leí que una secuencia de escape se almacena en la memoria como un solo personaje. ¿Eso significa que es más apropiado usar endl si vas a consumir poca memoria?
- ¿El manipulador de flujo utiliza 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.
c++
data-structures
Nathan Taylor
fuente
fuente
Respuestas:
o << std::endl
es equivalente al siguiente código:En otras palabras, solo debe usar
std::endl
cuando necesita vaciar la transmisión. Por ejemplo:Si no necesita vaciar el flujo, use en
\n
lugar destd::endl
. Las llamadas adicionales aflush
pueden afectar el rendimiento (a veces significativamente).Para más detalles, visite cppreference.com .
Con respecto al uso de la memoria: Preocuparse por el
\n
versusstd::endl
es casi seguro una microoptimización innecesaria, pero en general, esperaría\n
tener menos memoria.\n
es solo un byte más al final de un literal de cadena, mientras que la escriturastd::endl
es traducida por el compilador a (probablemente en línea) llamadas a funciones aput
yflush
.Las diferencias específicas de plataforma en los finales de línea (Windows
\r\n
versus Linux y OS X\n
) se manejan en un nivel más bajo questd::endl
y\n
:\n
, la traduce automáticamente al final de línea apropiado para la plataforma específica. Si lee un final de línea específico de la plataforma, la transmisión se traduce automáticamente a\n
.std::cout
ystd::cin
en particular, se tratan como si fueran en modo texto.fuente
1) Para portabilidad, usoEditar: según los comentarios, las terminaciones específicas del sistema de línea se manejan en un nivel inferior.endl
. Las nuevas líneas de Windows son\r\n
, Linux\n
y Mac\r
.2)
endl
lava la corriente,"\n"
no lo hace.3) Depende de la portabilidad.En cuanto al uso de memoria, puede minimizarlo volcando a otro almacenamiento con la mayor frecuencia posible
endl
. Sin embargo, disminuirá el rendimiento.Editar: aclara algunos errores.
fuente
\n
en cualquier máquina moderna.endl
y\n
son equivalentes con respecto a las terminaciones de línea específicas de la plataforma; Las diferencias de plataforma se manejan en un nivel inferior.End of line sequence
(asumiendo el modo de texto). ElEnd of line sequence
se convierte de nuevo a '\ n` cuando se lee desde un archivo. El punto 3) es dudoso. Y el último párrafo está nuevamente equivocado: el vaciado no le ahorrará espacio y el vaciado más de lo necesario ralentizará su código (el objetivo del búfer es mejorar la eficiencia de escritura en un dispositivo lento).