C++でコーディングするときに、改行(\n
)でcout
ステートメントを終了します。しかし、私の本能は常に文字列リテラルとしてこの改行を表現することでした。それは1文字であり、charリテラル('\n'
)としてより効率的に表現できますが、"\n"
です。例えば :1文字の文字列リテラルは、シンプルなchar型リテラルに最適化されていますか?
cout << "The value of var is " << var << "\n";
コードのたくさんは、この現象にあります。だから、質問は次のとおりです。
がは、改行文字定数を表現する2つの異なる方法の効率いかなる違いはありますか?私は生産されたプログラムの実行に実際の差異をつけることに心配していません(私はそれは些細なことでしょう)。むしろ、何らかの効率は、わずかなものであっても、何の理由もなく失われるかもしれないということだけをバグします。
文字列リテラルのバージョンが効率的でない場合、コンパイラは完全に同じ動作を提供するため、文字定数バージョンに最適化しますか?
私はまた、
std::endl
にも精通しています。ドキュメントでは、「このマニピュレータは、単純な改行が必要なときに誤って使用されることが多く、バッファリングのパフォーマンスが低下します。詳細はthis articleをご参照ください。しかし、この記事では、ファイルI/Oにしか言及されていない「パフォーマンスの低下」と、画面への書き込みにendl
を使用するとパフォーマンスが実際に向上する可能性があると述べています。これには何が関係していますか?
私はC++標準ライブラリを検索したが、<<
演算子のオーバーロード関連の実装を見つけることができませんでした。私はostream.tcc
での宣言を見つけました:
extern template ostream& operator<<(ostream&, char);
extern template ostream& operator<<(ostream&, const char*);
しかし、メカニックが実装で煮詰める方法などありません手掛かり。
これは何よりも理論的な質問のほうが多いので、私は読むことに興味がありません "praticalの違いはありません。そんなこと知ってる。私はちょうどそこに何か違いがあるかどうか、コンパイラがそれをどのように処理するのか不思議です。
存在する「1つの文字列リテラル」は、空の文字列だけです。ゼロ終端記号を忘れないでください。 –
'" \ n "'は 'const char [2]'型ですが、どのように*単一の文字に最適化できますか?また、あなたの質問3は無関係のようで、おそらく別の質問として投稿する必要があります。 – Praetorian
OPは完全にストレージの違いを認識しています。それは最初の段落でカバーされています。 OPは、この特別な1文字の場合にc文字列がコンパイラによって置換されるかどうかを尋ねる。単一の文字はターミネータを必要としません。 – justin