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() を呼び出したかのようにフラッシュします。
これは出力専用のI/Oマニピュレータであり、型がstd::basic_ostreamである任意のoutに対して、out << std::endl のような式で呼び出すことができます。
目次 |
[編集] 備考
このマニピュレータは、長時間実行されるプロセスからの出力を表示する場合、複数のスレッドの活動をログに記録する場合、または予期せずクラッシュする可能性のあるプログラムの活動をログに記録する場合など、出力を即座に生成するために使用できます。std::system の呼び出しの前に、生成されたプロセスが画面I/Oを実行する場合は、std::cout の明示的なフラッシュも必要です。他のほとんどの通常の対話型I/Oシナリオでは、std::cout と組み合わせて使用する場合、std::cin からの入力、std::cerr への出力、またはプログラムの終了によって std::cout.flush() が強制的に呼び出されるため、std::endl は冗長です。一部の情報源で推奨されているように、'\n' の代わりに std::endl を使用すると、出力パフォーマンスが大幅に低下する可能性があります。
多くの実装では、標準出力は行バッファリングされており、std::ios::sync_with_stdio(false) が実行されていない限り、'\n' を書き込むと常にフラッシュされます。そのような状況では、不要な endl は、標準出力ではなく、ファイル出力のパフォーマンスを低下させるだけです。
このwikiのコードサンプルは、Bjarne StroustrupとThe C++ Core Guidelinesに従い、必要な場合にのみ標準出力をフラッシュします。
不完全な出力行をフラッシュする必要がある場合は、std::flush マニピュレータを使用できます。
出力の各文字をフラッシュする必要がある場合は、std::unitbuf マニピュレータを使用できます。
[編集] パラメータ
| os | - | 出力ストリームへの参照 |
[編集] 戻り値
os (操作後のストリームへの参照)。
[編集] 例
endl の代わりに '\n' を使用すると、出力は同じになりますが、リアルタイムでは表示されない場合があります。
#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> の public メンバ関数) |