次のスニペットの効果の違いは何ですか?
cout << "Some text" << s1 << "some more text\n";
cout << "Some text" + s1 + "some more text\n";
次のスニペットの効果の違いは何ですか?
cout << "Some text" << s1 << "some more text\n";
cout << "Some text" + s1 + "some more text\n";
文字列に対する operator+ の結果は、新しい文字列です。したがって、例では
cout << "Some text" + s1 + "some more text\n";
全体が cout に書き込まれる前に、2 つの新しい文字列が作成されます (メモリ割り当てを意味します)。最初の例では、不要なメモリ割り当てなしですべてが cout に直接書き込まれます。
次のことを考慮してください。
cout << "Some text" + " " + "some more text\n";
それはあなたが思うことをしません。Operator +は、必ずしも連結を意味するわけではありません。
編集:生の文字列に適用される場合、operator+は連結しません-ポインタのアドレスを文字列に追加します。結果は、元の文字列とは関係のないメモリ領域を指しているため、ほとんど意味がないことが保証されます。運が良ければ、プログラムがクラッシュします。
編集2:どうやら私がこの間違いを犯してから非常に長い時間が経っています。結果は無意味なので、コンパイラはコンパイルを拒否します。
ええ、string operator+ (const char* lhs, const string& rhs)
名前のない一時文字列オブジェクトを作成して返します。
cout << "Some text"
ostream&ostream :: operator <<(const char * const)を呼び出し、ostream参照を返します。
cout << "Some text" << s1 << "some more text\n";
はostream::operator<<( "Some text").operator<<(s1).operator<<("some more text\n")
、coutを3回呼び出し、op <<の2つの異なるオーバーロード、aをとるconst* char* const
op <<、およびをとるop<<を呼び出しconst string&
ます。メモリの割り当てはなく、コピーはcoutのバッファへのコピーのみです。
cout << "Some text" + s1 + "some more text\n";
はostream::operator<<(t1)
一時的な文字列オブジェクト上にあります。t1と呼びます。t1は。からの一時的な結果です::operator+ ( "Some text", s1).operator+("some more text\n")
。(最初のoperator +は文字列のメンバーではなく、名前空間スコープのop +(const char * const、const string&)であることに注意してください。文字列を返すため、2番目の+"はstring:: operator +(const char * const)です。 。)
したがって、このコードでは、2つの一時的な文字列オブジェクトが作成されます(その後、破棄されます)。これは、文字列の2つの内部表現(つまり、2つのメモリ割り当て)と、新しく割り当てられた2つのコピー(coutのバッファへのコピーに加えて)を意味します。
2 番目は、文字列を cout に送信する前に連結します。これはパフォーマンス ヒットであり、大きな文字列では非常に大きくなる可能性があります。可能であれば、常に最初の形式を使用する必要があります。