2010-09-30 4 views
0

может кто-нибудь объяснить, что именно это означает? Я пытаюсь понять, в чем разница между clog и cerr, разница только в буферизацию заранее спасибобуферизация в iostream

ответ

2

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

С cerr этого не происходит.

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

Разумно представить себе, что что-то, написанное на cerr, может потребовать скорейшего действия, но что-то пишущее для забивания не будет, следовательно, разница.

+0

Можно было бы буферизировать буфер -> буфер -> буфера как логическую ошибку в коде и, следовательно, не очень важно, поскольку ошибки обычно не быстрее, чем правильный код. –

+0

@Martin, если эти буферы полностью удалены друг от друга, то его субоптимальные, но не неправильные. –

1

Разница между clog и cerr заключается в том, что clog полностью буферизуется, тогда как вывод на cerr записывается на внешнее устройство после каждого форматирования. С полностью буферизованным потоком вывод на фактическое внешнее устройство записывается только тогда, когда буфер заполнен. Таким образом, clog более эффективен для перенаправления вывода в файл, в то время как cerr в основном полезен для терминального ввода-вывода. Запись на внешнее устройство после каждого форматирования, на терминал в случае cerr, служит для синхронизации вывода и ввода с терминала. Кроме того, предопределенные потоки синхронизируются со связанными с ними стандартными файлами C.

+0

Итак, засорение осуществляется буферизированным потоком, а cerr - нет, не так ли? – hqt

Смежные вопросы