Чем отличается endl от n
Перейти к содержимому

Чем отличается endl от n

  • автор:

Кто быстрее: std::endl или «\n»?

До сегодняшнего дня я свято верил, что в потоках std::endl – это всегда правильнее, чем \n . Переносимость, и все такое. Но, увы.

#include #include int main() for (int i = 0; i  1000000; ++i) std::string s(1, 'x'); std::cout   ::endl; > return 0; > 

Компилируем и запускаем:

clang++ -o endl -O3 endl.cpp && time ./endl >rubbish real 0m4.518s user 0m1.080s sys 0m3.311s 
#include #include int main() for (int i = 0; i  1000000; ++i) std::string s(1, 'x'); std::cout   <'\n'; > return 0; > 

Компилируем и запускаем:

clang++ -o endl -O3 endl.cpp && time ./endl >rubbish real 0m0.263s user 0m0.236s sys 0m0.008s 

std::endl всегда flush ит поток, сбрасывая буфера. \n же просто пихает в поток символ начала новой строки, и большинстве случаев это и требуется. А когда надо, можно отдельно вызвать std::flush , один раз.

Отличие \n и endl

Чем отличается \n и endl? И то и другое переносит курсор на следующую строку, так? Тогда в чем разница этих команд? Есть ли случаи, в которых лучше использовать ту или иную команду?

На сколько я понимаю в разных ОС перенос строки разный. endl, думаю, под разные операционки тоже будет подстраиваться в отличии от \n

\n — это так называемая «ескейп последовательность».
повстречав этот символ терминал переведет каретку на строчку вниз,
и влево.

то бишь на начало новой строки.

endl — шаблон функции-манипулятора.

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

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

символ ‘\n’ лишь ещё один символ, который уйдёт в поток.
но не факт, что оттуда сразу на терминал.

endl — перевод строки, плюс все содержимое буфера сразу уйдет на терминал.

Случайные статьи

  • Возможно ли использовать в Delphi шрифты не установленные в системе?
  • Разбить период времени по месяцам
  • Сделать текст ссылкой
  • Рассылка. Выпуск 220
  • Конвертирование кодов в символы (URLDecode в Delphi)
  • Какую субд в delphi выбрать?
  • Рассылка. Выпуск 226
  • Скачивание файла через cmd
  • Перемещение символа стрелками
  • Как узнать букву жесткого диска и информацию о нём?

Чем отличается «\n» от std::endl?

Author24 — интернет-сервис помощи студентам

Какого типа std::endl ? Как сделать так, чтобы функция могла принимать endl в качестве аргумента?
Что надо указать в прототипе функции, чтобы можно передавать std::endl в качестве аргумента? Уже 3.

Чем boost::signal отличается от std::function
Чем boost::signal отличается от std::function ?

Ошибка в std::cout
есть следующая задача: -создать класс множество целых чисел. перегрузить операторы для следующих.

Манипулятор std::endl
Добрый день! Манипулятор std::endl — это некая глобальная функция, но почему она пишется без.

7703 / 6497 / 2957
Регистрация: 14.04.2014
Сообщений: 28,340

По сути ничем. Просто «\n» — строка, которая анализируется на общих основаниях, а endl — некая команда.

337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724

endl делает то, что и ‘\n’, но ещё и буфер вывода очищает, поэтому работает медленнее.
http://www.cplusplus.com/refer. l/?kw=endl

techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180

Вообще, endl, в зависимости от реализации может выполнять другие, специфичные для платформы вещи.
Например посылать не «\n», а «\r\n». А может вообще ничего не делать.

Но это. . . не часто.

Неэпический
17865 / 10631 / 2052
Регистрация: 27.09.2012
Сообщений: 26,731
Записей в блоге: 1
‘\n’ — escape sequence
endl — standard basic_ostream manipulator

ЦитатаСообщение от Mirmik Посмотреть сообщение

посылать не «\n», а «\r\n

Добавлено через неопределенное время

ЦитатаСообщение от Mirmik Посмотреть сообщение

А может вообще ничего не делать.
Из стандарта:
27.7.3.8 Standard basic_ostream manipulators

1 2 3 4
namespace std { template class charT, class traits> basic_ostreamcharT,traits>& endl(basic_ostreamcharT,traits>& os); }

1 Effects: Calls os.put(os.widen(‘\n’)) , then os.flush() .
2 Returns: os.
techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180

Стандарт стандартом, но когда речь идёт об устройствах, у которых вообще нет такого понятия как строка. Тогда начинаются всякие адаптации. Ну да, зря я эту тему начал.

337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724

ЦитатаСообщение от Mirmik Посмотреть сообщение

Например посылать не «\n», а «\r\n»
В Windows, \n и есть \r\n.
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

#include . Std. Endl
#include <conio.h> #include <lostream> using std:: cout; using std:: endl; int main() .

В чем отличия между std::cref() и std::bind()?
В документации не понял, что делает bind() ? И чем отличается cref() от операции взятия адреса? .

Почему std::string_view МЕДЛЕННЕЕ, чем std::string?
Всем привет! Нужно найти количество уникальных строк в больших текстовых файлах (размером до.

Есть ли в std, или где-нибудь ещё, константа для пустой строки («»), как endl (\n) для символа переноса?
Раздражает писать так: return "";

В чём разница между std::ios::app и std::ios_base::app
В чём разница между std::ios::app и std::ios_base::app? На практике разницы не вижу, но вопросом.

Или воспользуйтесь поиском по форуму:

C++ кто что использует: \n или endl или \r\n

и почему?
Для написания кроссплатформенных программ.
экивалентно ли «\n» «\r\n» «endl»
Что НУЖНО использовать?
С точки зрения быстродействия, кроссплатформенности, итд?
У кого какие возникали проблемы при переносе программ? (по теме топика)

qwertyqw
04.05.14 18:07:35 MSK
int13h ★★★★★
( 04.05.14 18:09:47 MSK )

MikeDM ★★★★★
( 04.05.14 18:11:03 MSK )

DELIRIUM ☆☆☆☆☆
( 04.05.14 18:13:52 MSK )
Ответ на: комментарий от DELIRIUM 04.05.14 18:13:52 MSK

Да, аналогичен. Но зачем сбрасывать буфер после каждой строки?

no-such-file ★★★★★
( 04.05.14 18:16:49 MSK )

Я ваще с++ не использую. \n.

Deleted
( 04.05.14 18:17:39 MSK )
Ответ на: комментарий от DELIRIUM 04.05.14 18:13:52 MSK

О май год, ещё и std::flush
По поводу буфера — как определяется, когда следует выгружать буфер? По завершению блока <>, или как-то ещё? (Или это сокрыто мраком и решает отдельный компилятор?)

qwertyqw
( 04.05.14 18:20:51 MSK ) автор топика

Ну как что? ApplicationRegistry::getInstance()->platformHelper()->endLine();

no-such-file ★★★★★
( 04.05.14 18:22:43 MSK )
Ответ на: комментарий от qwertyqw 04.05.14 18:20:51 MSK

прочитал, что буфер выгружаетсся в 2х случаях: при endl-flush и при просто flush. или ещё когда нибудь?
Подразумеваю работу с HDD

qwertyqw
( 04.05.14 18:26:25 MSK ) автор топика
Ответ на: комментарий от no-such-file 04.05.14 18:22:43 MSK

Эмм, а это что такое? Какой-то IP ? или фрейм ворк

qwertyqw
( 04.05.14 18:28:09 MSK ) автор топика
Ответ на: комментарий от qwertyqw 04.05.14 18:26:25 MSK

Когда буфер заполнится. Ваш К.О.

no-such-file ★★★★★
( 04.05.14 18:28:34 MSK )
Ответ на: комментарий от qwertyqw 04.05.14 18:28:09 MSK

Это тонкий намёк, на то, что не надо такие вещи хардкодить. Нужно брать из конфигурации приложения.

no-such-file ★★★★★
( 04.05.14 18:32:37 MSK )
Ответ на: комментарий от no-such-file 04.05.14 18:28:34 MSK

Да, как-то неподумал, спасибо, Кэп
А по поводу размера буфера (как посмотреть?)- он разный для каждой системы\консоли, или выбирается компилятором/или стандартный для всех систем?
или тоже слишком хардкорно smile.gif

qwertyqw
( 04.05.14 18:37:44 MSK ) автор топика

emulek ★
( 04.05.14 18:39:10 MSK )
Ответ на: комментарий от qwertyqw 04.05.14 18:20:51 MSK

как определяется, когда следует выгружать буфер? По завершению блока <>, или как-то ещё? (Или это сокрыто мраком и решает отдельный компилятор?)

это зависит от того, ЧТО и КУДА ты выводишь. На первое время могу посоветовать после каждого \n.

emulek ★
( 04.05.14 18:40:57 MSK )
Ответ на: комментарий от qwertyqw 04.05.14 18:26:25 MSK

никогда не делай flush. Система сама сделает когда надо.

emulek ★
( 04.05.14 18:42:11 MSK )
Ответ на: комментарий от emulek 04.05.14 18:42:11 MSK

Ок, всем спасибо, всё понятно

qwertyqw
( 04.05.14 18:54:52 MSK ) автор топика
Ответ на: комментарий от qwertyqw 04.05.14 18:20:51 MSK

printf(«\n») — это fwrite(«\n», 1, 1, stdout) и fflush(stdout).

tailgunner ★★★★★
( 04.05.14 19:02:52 MSK )
Ответ на: комментарий от tailgunner 04.05.14 19:02:52 MSK

$ ./run.sh + cat ./run.sh #!/bin/bash -x cat $0 gcc -x c - int main() < printf("1"); printf("2"); printf("3"); printf("\n"); printf("4"); printf("1"); printf("2"); printf("3"); printf("\n"); fflush(stdout); printf("4"); return 0; >EOF strace -ff -e write ./a.out >/dev/null g++ -x c++ - using namespace std; int main() < coutEOF strace -ff -e write ./a.out >/dev/null + gcc -x c - + strace -ff -e write ./a.out write(1, "123\n4123\n", 9) = 9 write(1, "4", 1) = 1 +++ exited with 0 +++ + g++ -x c++ - + strace -ff -e write ./a.out write(1, "123\n4123\n", 9) = 9 write(1, "4", 1) = 1 +++ exited with 0 +++ 

anonymous
( 04.05.14 19:48:34 MSK )
Ответ на: комментарий от anonymous 04.05.14 19:48:34 MSK

Если хотел что-то сказать — скажи словами.

tailgunner ★★★★★
( 04.05.14 19:56:56 MSK )
Ответ на: комментарий от DELIRIUM 04.05.14 18:13:52 MSK

Лучше кому? Не нужен буфер, есть std::cerr, нужна буферизация, зачем ее сбрасывать после каждой строки?

comp00 ★★★★
( 04.05.14 20:10:32 MSK )
Ответ на: комментарий от tailgunner 04.05.14 19:56:56 MSK

Коллега указал на обман в твоих словах

anonymous
( 04.05.14 20:13:39 MSK )
Ответ на: комментарий от tailgunner 04.05.14 19:56:56 MSK

printf(«\n») — это fwrite(«\n», 1, 1, stdout) и fflush(stdout).

anonymous
( 04.05.14 20:15:38 MSK )
Ответ на: комментарий от anonymous 04.05.14 20:13:39 MSK

Коллега указал на обман в твоих словах

Той коллега запостил длинную невнятную фигню, хотя с тем же успехом мог просто сказать «Ты лжешь». Как сделал другой твой коллега %)

tailgunner ★★★★★
( 04.05.14 20:19:38 MSK )
Последнее исправление: tailgunner 04.05.14 20:20:45 MSK (всего исправлений: 1)

Ответ на: комментарий от no-such-file 04.05.14 18:16:49 MSK

Да, аналогичен. Но зачем сбрасывать буфер после каждой строки?

Если это логгер, то лучше сбрасывать каждую строку.

andreyu ★★★★★
( 05.05.14 13:39:42 MSK )
19 апреля 2015 г.
Ответ на: комментарий от andreyu 05.05.14 13:39:42 MSK

Если это логгер, то лучше сбрасывать каждую строку.

Почему тогда не использовать небуферизованный stderr?

annulen ★★★★★
( 19.04.15 21:39:47 MSK )

Изредка увлекаюсь олимпиадным программированием, так перевод строки с помощью endl может добавить 1-2 секунды на больших массивах данных, при ограничении времени 2 секунды на задачу. Поэтому предпочитаю ‘\n’. А уже перед return’ом в main делаю endl либо flush. Иначе задача слита. Кстати, винде уже практически наплевать ‘\n’ или «\r\n». Так что выгодно юзать’\n’.

Deleted
( 19.04.15 22:21:57 MSK )
Ответ на: комментарий от annulen 19.04.15 21:39:47 MSK

Потому, что это не всегда stderr и не всегда нужен небуферизованый, а флашить бывает к месту.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *