Что означает смывание буфера?
Я изучаю С++, и я нашел то, что не могу понять:
Буферы вывода могут быть явно сброшены, чтобы заставить буфер быть написано. По умолчанию чтение cin
flushes cout
; cout
также очищается когда программа заканчивается нормально.
Так что сброс буфера (например, выходной буфер): очищает ли он буфер, удаляя все в нем или очищая буфер, выводя все в него? Или сброс буфера означает что-то совершенно другое?
Ответы
Ответ 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
Очистите буфер, выведя все.