std:: endl
|
Определено в заголовочном файле
<ostream>
|
||
|
template
<
class
CharT,
class
Traits
>
std:: basic_ostream < CharT, Traits > & endl ( std:: basic_ostream < CharT, Traits > & os ) ; |
||
Вставляет символ новой строки в выходную последовательность os и сбрасывает её в буфер, как если бы был вызван os. put ( os. widen ( ' \n ' ) ) с последующим вызовом os. flush ( ) .
Это манипулятор вывода, который может быть вызван выражением вида
out
<<
std
::
endl
для любого
out
типа
std::basic_ostream
.
Содержание |
Примечания
Этот манипулятор может использоваться для немедленного вывода строки, например, при отображении вывода длительного процесса, логировании активности нескольких потоков или логировании активности программы, которая может неожиданно завершиться аварийно. Явный сброс буфера
std::cout
также необходим перед вызовом
std::system
, если порожденный процесс выполняет любой ввод-вывод на экран. В большинстве других обычных интерактивных сценариев ввода-вывода,
std::endl
является избыточным при использовании с
std::cout
, поскольку любой ввод из
std::cin
, вывод в
std::cerr
или завершение программы принудительно вызывают
std::
cout
.
flush
(
)
. Использование
std::endl
вместо
'
\n
'
, рекомендуемое некоторыми источниками, может значительно снизить производительность вывода.
Во многих реализациях стандартный вывод буферизуется построчно, и запись
'
\n
'
в любом случае вызывает сброс буфера, если только
std
::
ios
::
sync_with_stdio
(
false
)
не была выполнена. В таких ситуациях необоснованное использование
endl
ухудшает производительность только при выводе в файл, но не при стандартном выводе.
Примеры кода на этой вики следуют подходу Бьярне Страуструпа и C++ Core Guidelines в сбросе буфера стандартного вывода только там, где это необходимо.
Когда неполная строка вывода должна быть сброшена, может использоваться манипулятор std::flush .
Когда каждый символ вывода должен быть сброшен, можно использовать std::unitbuf манипулятор.
Параметры
| os | - | ссылка на выходной поток |
Возвращаемое значение
os (ссылка на поток после манипуляции).
Пример
При использовании
'
\n
'
вместо
endl
вывод будет таким же, но может не появляться в реальном времени.
#include <chrono> #include <iostream> template<typename Diff> void log_progress(Diff d) { std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(d) << " passed" << std::endl; } int main() { std::cout.sync_with_stdio(false); // on some platforms, stdout flushes on \n static volatile int sink{}; const auto t1 = std::chrono::high_resolution_clock::now(); for (int i = 0; i < 5; ++i) { for (int j = 0; j < 10000; ++j) for (int k = 0; k < 20000; ++k) sink += i * j * k; // do some work log_progress(std::chrono::high_resolution_clock::now() - t1); } }
Возможный вывод:
566ms passed 1133ms passed 1699ms passed 2262ms passed 2829ms passed
Смотрите также
|
управляет тем, сбрасывается ли вывод после каждой операции
(функция) |
|
|
сбрасывает выходной поток
(шаблон функции) |
|
|
синхронизирует с базовым устройством хранения
(публичная функция-член
std::basic_ostream<CharT,Traits>
)
|