¿Qué significa vaciar el búfer?


95

Estoy aprendiendo C ++ y encontré algo que no puedo entender:

Los búferes de salida se pueden vaciar explícitamente para forzar la escritura del búfer. De forma predeterminada, la lectura se cindescarga cout; couttambién se elimina cuando el programa finaliza normalmente.

Entonces, vaciar el búfer (por ejemplo, un búfer de salida): ¿esto borra el búfer al eliminar todo lo que hay en él o lo borra al sacar todo lo que contiene? ¿O vaciar el búfer significa algo completamente diferente?

Respuestas:


122

Considere escribir en un archivo. Esta es una operación cara. Si en su código escribe un byte a la vez, entonces cada escritura de un byte será muy costosa. Entonces, una forma común de mejorar el rendimiento es almacenar los datos que está escribiendo en un búfer temporal. Solo cuando hay muchos datos, el búfer se escribe en el archivo. Al posponer las escrituras y escribir un bloque grande de una sola vez, se mejora el rendimiento.

Con esto en mente, vaciar el búfer es el acto de transferir los datos del búfer al archivo.

¿Esto borra el búfer eliminando todo lo que hay en él o borra el búfer sacando todo lo que contiene?

El último.


1
Gracias. una cosa más. Leer cin se ruboriza cout. ¿Esta "lectura de cin" significa cuando el usuario ingresa algo o cuando se le pide al usuario que ingrese algo?
Mohamed Ahmed Nabil

4
La lectura de cin ocurre cuando usa el operador de flujo para leer desde cin. Por lo general, desea eliminar cout cuando lee porque, de lo contrario, la entrada puede aparecer antes del indicador.
David Heffernan

1
@DavidHeffernan Hasta donde yo sé, nunca necesitas vaciar cout antes que cin, porque cin y cout están empatados (Stroustrup, El lenguaje de programación C ++, [io.tie]).
sturmer

24

Has citado la respuesta:

Los búferes de salida se pueden vaciar explícitamente para forzar la escritura del búfer.

Es decir, es posible que deba "vaciar" la salida para que se escriba en la secuencia subyacente (que puede ser un archivo o, en los ejemplos enumerados, una terminal).

Generalmente, stdout / cout está almacenado en búfer de línea: la salida no se envía al sistema operativo hasta que escribe una nueva línea o vacía explícitamente el búfer. La ventaja es que algo así std::cout << "Mouse moved (" << p.x << ", " << p.y << ")" << endlprovoca solo una escritura en el "archivo" subyacente en lugar de seis, lo que es mucho mejor para el rendimiento. La desventaja es que un código como:

for (int i = 0; i < 5; i++) {
    std::cout << ".";
    sleep(1); // or something similar
}

std::cout << "\n";

se generará .....de inmediato (para una sleepimplementación exacta , consulte esta pregunta ). En tales casos, querrá un adicional << std::flushpara asegurarse de que se muestre la salida.

Leer cindescargas coutpara que no necesite una descarga explícita para hacer esto:

std::string colour;
std::cout << "Enter your favourite colour: ";
std::cin >> colour;

Haciendo esto para (int i = 0; i <5; i ++) {std :: cout << "."; dormir (1); } std :: cout << std :: endl; no imprime ..... a la vez. Los imprime con 1 milisegundo entre ellos. Lo notará más cuando use el sueño (1000)
Mohamed Ahmed Nabil

@MohamedAhmedNabil Parece que confundes sleep()(POSIX) con Sleep()(Windows)
tc.

1
La respuesta anterior, pero el único comentario es menos sobre el contenido y más sobre el ejemplo. Califica coutcon un espacio de nombres (es decir, std::cout) pero no lo hizo para el endl, que también debería requerir esa calificación.
vol7ron

1
Me gusta tu ejemplo. Pero pensé que endl vacía el búfer, pero en tu ejemplo, \ n vacía el búfer. Estoy confundido.
Naz

1
@Naz \ n no vacía el búfer; el búfer solo se vacía al final del programa en este ejemplo (el búfer siempre se vacía automáticamente al final de los programas C ++). Es probable que \ n solo se haya utilizado para formatear. Además, tiene razón en que std :: endl vacía el búfer (también lo hace std :: flush, pero eso se explica por sí mismo).
liamnickell

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.