ストリームマニピュレータ(endl)または改行エスケープ文字(\ n)を使用していますか?


12

質問している特定のコンテキストはありませんが、C ++の初心者向けの本を読んでいるときに、ストリームオブジェクトを処理するときにendlストリームマニピュレーターと改行エスケープ文字の両方を使用していることに気付きました。

例は次のとおりです。

cout << "Hello World" << endl;
cout << "Hello World\n";

私の質問は:

  1. 特定の状況でストリームマニピュレーター(endl)を使用し、別の状況でエスケープ文字を使用する方が適切ですか?
  2. 2つのうちの1つを使用するのが賢明な効率上の欠点はありますか?
  3. それらは完全に交換可能ですか?
  4. エスケープシーケンスは単一の文字としてメモリに格納されることを読みました。それは、低メモリ消費のためにendlを使用することがより適切であることを意味しますか?
  5. ストリームマニピュレータはメモリを使い果たしますか?

おかげで、StackExchangeが間違ったセクションにこれを投稿した場合、データ構造としてカウントされると思いました。


2
また、endlは一部のストリームでフラッシュを引き起こしますが、 '\ n'はそうではありません。
ジェームズ

回答:


12

o << std::endl 次のコードと同等です。

o.put(o.widen('\n'));
o.flush();

つまり、std::endlストリームをフラッシュする必要がある場合にのみ使用する必要があります。例えば:

  • 時間のかかる操作を実行しようとしているため、その前にメッセージを表示するようにします。
  • 別のプロセスが出力を待機しています。
  • 複数のスレッドまたはプロセスが実行されている場合、各スレッドまたはプロセスからの出力が正しく表示されるように、出力をフラッシュする必要がある場合があります。(それ以外の場合、不自然な間隔でインターリーブされた一見ランダムな出力ブロックを取得する可能性があります。)

ストリームをフラッシュする必要がない場合は、の\n代わりに使用しますstd::endl。を余分に呼び出すと、flushパフォーマンスが低下することがあります(場合によっては大幅に)。

詳細については、cppreference.comを参照してください。

メモリ使用量に関して:\n対を心配することstd::endlは、ほぼ確実に不必要なマイクロ最適化ですが、一般的に、\nより少ないメモリを使用することを期待しています。 \n書き込みをしながら、文字列リテラルの終わりにちょうど1より多くのバイトが、あるstd::endl(おそらくインライン化)へのコンパイラへの関数呼び出しで翻訳されていますputflush

行末のプラットフォーム固有の違い(Windows \r\n対LinuxおよびOS X \n)は、std::endlおよびより低いレベルで処理されます\n

  • ストリームがテキストモードで開かれている場合、を記述\nすると、適切なプラットフォーム固有の行末に自動的に変換されます。プラットフォーム固有の行末を読み取ると、ストリームは自動的にそれをに変換し\nます。
  • ストリームがバイナリモードで開かれている場合、行末を逐語的に渡すのはあなた次第です。
  • 以下の場合std::coutstd::cin特に、それらがしているテキストモードかのように扱わいます。

1

1)移植性のために、を使用しますendl。Windowsの改行は\r\n、Linux \nとMac \rです。 編集:コメントによると、ラインシステム固有のエンディングは下位レベルで処理されます。

2)endlストリームをフラッシュしますが、フラッシュ"\n"しません。

3)移植性に依存します。

メモリ使用量については、できるだけ頻繁に他のストレージにフラッシュすることで最小化できますendl。ただし、パフォーマンスは低下します。

編集:いくつかの間違いを解決します。


2
MacはOS X以降UNIXベース\nであり、最新のマシンでも使用されています。

7
申し訳ありませんが、これは間違っています。 endlそして\n、プラットフォーム固有の行末へに関して同等です。プラットフォームの違いは、より低いレベルで処理されます。
ジョシュケリー

2
最初の点は間違っています。endl()は(フラッシュに加えて) '\ n'をストリームに送信します。'\ n'文字はプラットフォーム固有に変換されますEnd of line sequence(テキストモードを想定)。End of line sequenceファイルから読み込むとき、」\ N 'に変換されたバックです。ポイント3)は疑わしい。最後の段落も間違っています:フラッシュしてもスペースが節約されず、必要以上にフラッシュするとコードが遅くなります(バッファのポイントは、遅いデバイスへの書き込み効率を改善することです)。
マーティンヨーク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.