Этот вопрос уже имеет ответ здесь:
Кто-либо может объяснить различие между cerr судом и засориться и почему делает различные объекты, предложены?
Я знаю, что различия как указано ниже:
1) суд может перенаправленный, но cerr не может
2) помеха может использовать буфер.
Я смущен точкой 2, я благодарен, если кто-либо может разработать ее больше.
Буферизованный вывод обычно намного быстрее, чем небуферизованный. Так что если вы хотите быстро записать огромное количество данных в журнал (но не заботитесь о том, попадут ли они туда), вы будете использовать clog, а не cerr.
И все потоки обычно можно перенаправить, если предположить, что операционная система достаточно компетентна, но это не входит в стандарт C++, в котором нет такого понятия, как "перенаправление".
Вывод может быть буферизованным или небуферизованным. С буферизованным выводом реализация сохраняет весь вывод до тех пор, пока его не будет удобно записать на диск (или где-нибудь еще). Это хорошо и эффективно, но если программа выйдет из строя, какой-то вывод, скорее всего, будет утерян. Реализация должна записывать небуферизованный вывод на диск по мере его возникновения, что может замедлить работу из-за большого количества операций записи на диск, но, если не произойдет сбоя программы во время ее записи, она будет записана на диск.
Нет реальной функциональной разницы между стандартным выводом и стандартной ошибкой; это просто два разных выходных потока, которые можно перенаправлять отдельно. Философия объединения инструментов Unix в цепочку заключается в том, что стандартный вывод будет иметь соответствующий вывод для ввода следующего инструмента, а для этого в значительной степени требуется, чтобы был отдельный поток для сообщений об ошибках.
Итак, cout
записывает на стандартный вывод и буферизируется. Используйте это для нормального вывода. cerr
записывает в стандартный поток ошибок и не буферизуется. Используйте это для сообщений об ошибках. clog
записывает в стандартный поток ошибок, но буферизируется. Это полезно для ведения журнала выполнения, поскольку оно не мешает стандартному выводу, но эффективно (за счет того, что конец журнала может быть потерян в случае сбоя программы).
Оба могут быть перенаправлены.
В большинстве реализаций cerr не будет буферизован, не уверен, что это официальное требование POSIX, но это безумие - иметь буферизованный поток ошибок.
Причина наличия отдельных потоков - в философии unix, согласно которой вывод одной программы является входом для следующей. Если 'ls' идет прямо к 'sort', то проще вывести ошибки на консоль, чем писать sort, чтобы понять, является ли входное сообщение ошибкой или частью текста, который вы хотите отсортировать.