Что означает смывание буфера? - программирование
Подтвердить что ты не робот

Что означает смывание буфера?

Я изучаю С++, и я нашел то, что не могу понять:

Буферы вывода могут быть явно сброшены, чтобы заставить буфер быть написано. По умолчанию чтение cin flushes cout; cout также очищается когда программа заканчивается нормально.

Так что сброс буфера (например, выходной буфер): очищает ли он буфер, удаляя все в нем или очищая буфер, выводя все в него? Или сброс буфера означает что-то совершенно другое?

4b9b3361

Ответ 1

Рассмотрим запись в файл. Это дорогостоящая операция. Если в вашем коде вы пишете один байт за раз, то каждая запись байта будет очень дорогостоящей. Таким образом, общий способ повышения производительности - хранить данные, которые вы пишете во временном буфере. Только при наличии большого количества данных буфер записывается в файл. Откладывая записи и записывая большой блок за один раз, производительность улучшается.

С учетом этого, промывка буфера является актом передачи данных из буфера в файл.

Очищает ли этот буфер, удаляя все в нем или очищая буфер, выводя все в него?

Последний.

Ответ 2

Вы процитировали ответ:

Выходные буферы могут быть явно сброшены, чтобы заставить буфер быть записанным.

То есть вам может потребоваться "очистить" вывод, чтобы заставить его быть записанным в базовый поток (который может быть файлом или в приведенных примерах терминалом).

Обычно stdout/cout буферизуется строкой: вывод не отправляется в ОС, пока вы не напишите новую строку или явно не очистите буфер. Преимущество состоит в том, что что-то вроде std::cout << "Mouse moved (" << px << ", " << py << ")" << endl вызывает только одну запись в базовый "файл" вместо шести, что намного лучше для производительности. Недостатком является то, что такой код:

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

std::cout << "\n";

будет выводить ..... сразу (для точной реализации sleep, см. этот вопрос). В таких случаях вам понадобится дополнительная << std::flush чтобы обеспечить отображение вывода.

Чтение cin сбросов cout поэтому для этого вам не нужен явный сброс:

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

Ответ 3

Очистите буфер, выведя все.