Spec-Zone.ru › C++

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++ и сбрасывают стандартный вывод только при необходимости.

Если необходимо сбросить неполную строку вывода, можно использовать манипулятор 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

См. также

unitbufnounitbuf
управляет тем, сбрасывается ли вывод после каждой операции
(функция)
flush
сбрасывает выходной поток
(шаблон функции)
flush
синхронизирует поток с базовым устройством хранения данных
(открытая функция-член std::basic_ostream<CharT,Traits>)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/io/manip/endl

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API