У меня нет конкретного контекста, в котором я задаю вопрос, но когда я читал книгу для начинающих на C ++, я заметил использование как манипулятора endl stream, так и escape-символа новой строки при работе с потоковым объектом.
Пример таков:
cout << "Hello World" << endl;
cout << "Hello World\n";
Мои вопросы:
- Правильнее ли использовать потоковый манипулятор (endl) в определенной ситуации и escape-символ в другой?
- Есть ли недостатки в эффективности использования одного из двух?
- Они полностью взаимозаменяемы?
- Я прочитал, что escape-последовательность хранится в памяти как один символ. Означает ли это, что более целесообразно использовать endl, если вы собираетесь использовать мало памяти?
- Использует ли потоковый манипулятор память каким-либо образом, если это больше, чем escape-последовательность?
Спасибо, StackExchange Извинения, если я разместил это в неправильном разделе, я думал, что это считается структурой данных.
c++
data-structures
Натан Тейлор
источник
источник
Ответы:
o << std::endl
эквивалентно следующему коду:Другими словами, вы должны использовать только
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) Для мобильности используйтеРедактировать: Согласно комментариям, специфические окончания системы линий обрабатываются на более низком уровне.endl
. Новыми строками Windows являются\r\n
Linux\n
и Mac\r
.2)
endl
сбрасывает поток,"\n"
не делает.3) Зависит от портативности.Что касается использования памяти, вы можете минимизировать его, сбрасывая в другое хранилище как можно чаще
endl
. Однако это снизит производительность.Изменить: Устранить некоторые ошибки.
источник
\n
на любой современной машине.endl
и\n
эквивалентны в отношении концов линий для конкретной платформы; Различия платформ обрабатываются на более низком уровне.End of line sequence
(в текстовом режиме).End of line sequence
Преобразуется обратно в «\ n` при чтении из файла. Пункт 3) сомнительный И последний абзац снова неверен: очистка не сэкономит ваше пространство, а очистка больше, чем требуется, замедлит ваш код (цель буфера - повысить эффективность записи на медленное устройство).