多くの場合、C++ でコーディングする場合、cout
ステートメントを改行 ( \n
) で終了します。ただし、私の本能は常に、この改行を文字列リテラル: として"\n"
表現することでしたが、これは単一の文字であり、char リテラル ( ) としてより効率的に表現できます'\n'
。例えば:
cout << "The value of var is " << var << "\n";
この現象には多くのコードがあります。したがって、質問は次のとおりです。
改行文字定数を表現する2つの異なる方法の効率に違いはありますか? 作成されたプログラムの実行に実際の違いが生じることについては心配していません (これは些細なことだと思います)。むしろ、どんなにわずかな効率であっても、理由もなく失われる可能性があることは、私を悩ませています。
文字列リテラル バージョンの効率が悪い場合、コンパイラはそれを文字定数バージョンに最適化しますか?
にも精通してい
std::endl
ます。ドキュメントには、「このマニピュレータは、単純な改行が必要な場合に誤って使用されることが多く、バッファリングのパフォーマンスが低下する」と記載されています。詳細については、この記事を参照してください。ただし、その記事では、言及されている「パフォーマンスの低下」はファイル I/O にのみ適用さendl
れ、画面への書き込みに使用すると実際にパフォーマンスが向上する可能性があると述べています。これはどうしたの?
<<
C++ 標準ライブラリを検索しましたが、関連する演算子のオーバーロードの実装が見つかりませんでした。私は宣言を見つけましたostream.tcc
:
extern template ostream& operator<<(ostream&, char);
extern template ostream& operator<<(ostream&, const char*);
しかし、実装でメカニズムがどのように煮詰まるかについての手がかりはありません。
これは何よりも理論的な問題であるため、「この 2 つの間に実質的な違いはない」と読むことに興味はありません。そんなこと知ってる。違いがあるのか 、コンパイラがそれをどのように処理するのか疑問に思っています。