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/w/cpp/io/manip/endl

Spec-Zone.ru

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