среда, 20 марта 2019 г.

Буферизованный вывод в C++.


При выводе через поток std::cout (и аналогичные, такие, как файловые потоки, строковые потоки, наверняка есть и другие) вывод отправляется на консоль не сразу. Данные буферизуются, и при превышении определённого объёма данных разом отправляются на консоль.

В этом нетрудно убедиться самостоятельно. Я это увидел на практике, когда выводил в файл. Пока программа не была завершена (у меня она останавливалась на паузе) - в файле не появлялось ни единой строчки.

Есть возможность в определённый момент принудить поток сбросить буфер. Для этого есть функция flush:
std::cout.flush();
При этом всё накопленное содержимое буфера будет отправлено на консоль (или на соответствующее устройство вывода).

Также сброс буфера происходит всякий раз, когда в поток отправляется std::endl:
std::cout << std::endl;
Обратите внимание, это означает, что если много использовать std::endl , ты вы рискуете серьёзно замедлить работу программы. Если сброс буфера не критичен, то ради ускорения имеет смысл делать переход на новую строку чуть по-другому:
std::cout << "\n";
Здесь мы просто отправили в поток символ перехода на новую строку, но не сделали сброс буфера, позволив потоку самостоятельно решить, когда будет необходимо это сделать.

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

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

Также есть возможность настроить поток так, чтобы сброс буфера происходил всякий раз при отправке к него каких-либо данных, для этого отправьте в него объект std::unitbuf:
std::cout << std::unitbuf;
Чтобы вернуть стандартное поведение буфера отправьте в поток объект std::nounitbuf:
std::cout << std::nounitbuf;
Кто-то скажет, что очень маловероятна ситуация, когда отключение работы буфера может понадобиться, я тоже так думал, но недавно эта ситуация встретилась в жизни. Так что случиться может всё, и вроде бы лишние возможности могут однажды помочь.

Комментариев нет:

Отправить комментарий