Разница между std::endl и (относительно осведомленности о платформе)
Вопрос
Прежде чем вы объявите этот вопрос дубликатом этот или тот, пожалуйста, учтите, что я отправил проблему в онлайн-судья с \n
и получил WA, а затем с std::endl
и включил кондиционер.Итак, мне нужен очень конкретный ответ на этот вопрос. осведомленность о платформе:Является \n
действительно ли платформа осведомлена, и действительно ли среда выполнения записывает правильную строку, заканчивающуюся в соответствии с платформой, как утверждается в ответах на другие вопросы?Если да, то не могли бы вы, пожалуйста, рассказать мне, как это произошло??
Если ответ может быть подкреплен цитатой из стандарта, касающейся проблемы осведомленности о платформе, я был бы очень благодарен.Я прочитал ответы на все остальные вопросы (даже на закрытые), поэтому, пожалуйста, не повторяйте фразу "очищает буфер".
Решение
От C++11
, §27.7.3.8
-
namespace std
{
template <class charT, class traits>
basic_ostream<charT,traits>& endl(basic_ostream<charT,traits>& os);
}
Эффекты:Вызывает os.put(os.widen(’ ’)), затем os.flush().
Возвращает:os.
Итак, из стандарта ясно, что endl
очищает буфер выходного потока, в то время как \n
не.Как правило, вы захотите использовать endl
для печати новой строки, но вы также должны иметь в виду, что каждый раз, когда вы это делаете, выходной буфер тоже будет очищаться.
Об осведомленности о платформе
Из стандарта очевидно, что оба делают одно и то же - печатают новую строку точно таким же образом.Итак, если один из них не зависит от платформы, то другой также должен быть таким же.Поскольку я знаю наверняка endl
является независимым от платформы, то же самое должно быть и для \n
.
Другие советы
std::endl
это манипулятор, который выводит '\n'
, затем спускает струю.Для большинства повседневных целей это то, что вам следует использовать.Однако при выводе больших объемов данных это может привести к значительному снижению производительности, и в этом случае используйте '\n'
.
РЕДАКТИРОВАТЬ:
Что касается осведомленности о платформе:оба выводят одно и то же.Если поток был открыт в текстовом режиме, то '\n'
приведет к появлению зависящего от платформы представления окончания строки:0x0A под Unix, 0x0D, 0x0A под Windows, запуск новой записи под некоторыми мэйнфреймами и т.д.Если поток был открыт в двоичном режиме, это приведет к выводу одного байта (обычно 0x0A, но на самом деле это зависит от используемой базовой кодировки символов).