Используя потоковый манипулятор (endl) или символ перехода на новую строку (\ n)?


12

У меня нет конкретного контекста, в котором я задаю вопрос, но когда я читал книгу для начинающих на C ++, я заметил использование как манипулятора endl stream, так и escape-символа новой строки при работе с потоковым объектом.

Пример таков:

cout << "Hello World" << endl;
cout << "Hello World\n";

Мои вопросы:

  1. Правильнее ли использовать потоковый манипулятор (endl) в определенной ситуации и escape-символ в другой?
  2. Есть ли недостатки в эффективности использования одного из двух?
  3. Они полностью взаимозаменяемы?
  4. Я прочитал, что escape-последовательность хранится в памяти как один символ. Означает ли это, что более целесообразно использовать endl, если вы собираетесь использовать мало памяти?
  5. Использует ли потоковый манипулятор память каким-либо образом, если это больше, чем escape-последовательность?

Спасибо, StackExchange Извинения, если я разместил это в неправильном разделе, я думал, что это считается структурой данных.


2
endl также вызывает сброс некоторых потоков, '\ n' - нет.
Джеймс

Ответы:


12

o << std::endl эквивалентно следующему коду:

o.put(o.widen('\n'));
o.flush();

Другими словами, вы должны использовать только std::endlтогда, когда вам нужно очистить поток. Например:

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

Если вам не нужно очищать поток, используйте \nвместо std::endl. Дополнительные вызовы flushмогут снизить производительность (иногда значительно).

Для получения дополнительной информации см. Cppreference.com .

Относительно использования памяти: беспокоиться о \nпротив std::endl- почти наверняка ненужная микрооптимизация, но в целом я бы ожидал, \nчто потребуется меньше памяти. \nэто всего лишь еще один байт в конце строкового литерала, в то время как запись std::endlпереводится компилятором в (возможно, встроенные) вызовы функций putи flush.

Специфичные для платформы различия в окончаниях строк (Windows \r\nи Linux и OS X \n) обрабатываются на более низком уровне, чем std::endlи \n:

  • Если поток открывается в текстовом режиме, то, если вы пишете \n, он автоматически переводит его в соответствующий для конкретной платформы конец строки. Если вы читаете окончание строки для конкретной платформы, поток автоматически преобразует его в \n.
  • Если поток открывается в двоичном режиме, он дословно пропускает любые окончания строк, и вам решать.
  • Для std::coutи , std::cinв частности, они рассматриваются , как если бы они в текстовом режиме.

1

1) Для мобильности используйте endl. Новыми строками Windows являются \r\nLinux \nи Mac \r. Редактировать: Согласно комментариям, специфические окончания системы линий обрабатываются на более низком уровне.

2) endlсбрасывает поток, "\n"не делает.

3) Зависит от портативности.

Что касается использования памяти, вы можете минимизировать его, сбрасывая в другое хранилище как можно чаще endl. Однако это снизит производительность.

Изменить: Устранить некоторые ошибки.


2
Mac был основан на Unix начиная с OS X и, следовательно, также \nна любой современной машине.

7
Извините, но это неверно. endlи \nэквивалентны в отношении концов линий для конкретной платформы; Различия платформ обрабатываются на более низком уровне.
Джош Келли

2
Ваш первый пункт неверен. endl () отправляет в поток '\ n' (в дополнение к его очистке). Символ '\ n' преобразуется в платформу End of line sequence(в текстовом режиме). End of line sequenceПреобразуется обратно в «\ n` при чтении из файла. Пункт 3) сомнительный И последний абзац снова неверен: очистка не сэкономит ваше пространство, а очистка больше, чем требуется, замедлит ваш код (цель буфера - повысить эффективность записи на медленное устройство).
Мартин Йорк,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.