web-dev-qa-db-ja.com

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

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

その例は次のとおりです。

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

私の質問は:

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

ありがとう、StackExchange謝罪これを間違ったセクションに投稿した場合、データ構造として数えられると思った。

12
king9x

_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_の書き込みは、コンパイラによってputおよびflushへの(おそらくインライン化された)関数呼び出しに変換されます。

行末のプラットフォーム固有の違い(Windows _\r\n_とLinuxおよびOS X _\n_)は、_std::endl_および_\n_よりも低いレベルで処理されます。

  • ストリームがテキストモードで開かれている場合、_\n_を書き込むと、適切なプラットフォーム固有の行末に自動的に変換されます。プラットフォーム固有の行末を読み取る場合、ストリームはそれを自動的に_\n_に変換します。
  • ストリームがバイナリモードで開かれている場合、それらはすべての行末を逐語的に渡し、それはあなた次第です。
  • 特に_std::cout_および_std::cin_の場合、テキストモードであるかのように扱われます。
12
Josh Kelley

1)移植性のために、endlを使用します。 Windowsの改行は\r\n、Linux \nおよびMac \r 編集:コメントに従って、行システム固有の末尾はより低いレベルで処理されます。

2)endlはストリームをフラッシュし、"\n" ではない。

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

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

編集:いくつかの間違いを修正します。

1
Kent