std::endl
| ヘッダ <ostream> で定義
|
||
template< class CharT, class Traits > std::basic_ostream<CharT, Traits>& endl( std::basic_ostream<CharT, Traits>& os ); |
||
os.put(os.widen('\n')) に続いて os.flush() を呼んだかのように、出力シーケンス os に改行文字を挿入してフラッシュします。
これは出力専用の入出力マニピュレータであり、 std::basic_ostream 型の任意の out に対して out << std::endl のような式で呼ぶことができます。
ノート
このマニピュレータは、例えば実行時間の長いプロセスの出力を表示したり、複数のスレッドの活動のログを記録したり、予期せずクラッシュすることがあるプログラムのログを記録したりするときに、出力の不完全な行を直ちに生成するために使用することができます。 std::cout の明示的なフラッシュは、呼び出したプロセスがいかなる画面入出力も行わない場合、 std::system の呼び出しの前にも必要です。 その他のほとんどの通常の対話型の入出力のシナリオでは、 std::cin からのあらゆる入力、 std::cerr への出力、またはプログラムの終了により std::cout.flush() の呼び出しが強制的に行われるため、 std::cout を使用するときは std::endl は冗長です。 '\n' の代わりに std::endl を使用することは、いくつかのソースによって推奨されていますが、出力の性能を著しく落とす可能性があります。
多くの処理系では、標準出力は行バッファリングされており、 std::ios::sync_with_stdio(false) が実行されていない限り、どのみち '\n' の書き込みによりフラッシュされます。 これらの状況では、不要な endl は標準出力ではなくファイル出力の性能を落とすだけです。
この wiki のサンプルコードは、必要な場合にのみ標準出力をフラッシュすることについて、 Bjarne Stroustrup および C++ Core Guidelines に従っています。
出力の不完全な行をフラッシュする必要があるときは、 std::flush マニピュレータを使用することができます。
出力のすべての文字をフラッシュする必要があるときは、 std::unitbuf マニピュレータを使用することができます。
引数
| os | - | 出力ストリームへの参照 |
戻り値
os (操作後のストリームへの参照)。
例
endl の代わりに \n を使用すると、出力は同じでしょうが、リアルタイムには現れないかもしれません。
#include <iostream>
#include <chrono>
template<typename Diff>
void log_progress(Diff d)
{
std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(d).count()
<< " ms passed" << std::endl;
}
int main()
{
std::cout.sync_with_stdio(false); // プラットフォームによっては \n で stdout がフラッシュされます。
volatile int sink = 0;
auto t1 = std::chrono::high_resolution_clock::now();
for (int j=0; j<5; ++j)
{
for (int n=0; n<10000; ++n)
for (int m=0; m<20000; ++m)
sink += m*n; // 何か処理をします。
auto now = std::chrono::high_resolution_clock::now();
log_progress(now - t1);
}
}
出力例:
487 ms passed
974 ms passed
1470 ms passed
1965 ms passed
2455 ms passed
関連項目
| 各操作ごとに出力をフラッシュするかどうか制御します (関数) | |
| 出力ストリームをフラッシュします (関数テンプレート) | |
| ベースとなるストレージデバイスと同期します ( std::basic_ostream<CharT,Traits>のパブリックメンバ関数)
|