4

QtQStringは連結できますoperator%。これは、式テンプレートを使用して、結果の文字列のサイズを事前に計算し、へのいくつかの連鎖呼び出しを最適化しoperator+ます。詳細については、私のこの質問を参照してください。

なぜstd::basic_string同様の構成を採用していないのですか?これはC++11でも許可されていますか?私は利点だけを見て、明らかにABIの互換性は、ライブラリの実装者が望むときに壊すことができます(そして、C ++11はlibstdc++に対しても正当な理由を提供しました)。

4

2 に答える 2

5

誰もそれを標準として提案しなかったからです。誰かが何かを提案しない限り、それは入りません。また、既存のコードを壊す可能性があるためです(彼らがそれを使用operator+している場合)。

また、式テンプレートは、が存在する場合はうまく機能しませんautoauto concat = str1 % str2;簡単に壊れる可能性があるのと同じくらい簡単なことをすること。うまくいけば、これはC++17が何らかの手段で解決する問題です。

于 2012-08-25T12:00:17.617 に答える
1

C ++ 11ではstd::basic_string、移動セマンティクスをサポートしています。つまり、一連の文字列operator+の最初の文字列にメモリを割り当てて、一連の文字列の連結を最適化し、残りの文字列を、一連の文字列を連結して返すために必要なメモリ割り当てとコピーの数を大幅に削減します。

Qtの方法で指摘したように、さらに最適化できると確信していますが、C ++ 11で許可されている移動セマンティクスはstd::basic_string、特にC++03バージョンに存在していたパフォーマンスの大きなハードルを克服します。たくさんの文字列を連結するとき。

たとえば、

std::string a = std::string("Blah blah") + " Blah Blah " + " Yadda, Yadda";

最初の文字列にメモリを割り当て、次に移動セマンティクスを使用して、最初の文字列から残りのメモリを「盗み」、2番目の2つの文字列をインプレースで構築し、余分なものがなくなった場合にのみメモリを再割り当てすることで実行できます。スペース。最後に、代入演算子は、move-semanticsを使用して、代入演算子の右側に作成された一時的なr値からメモリを「盗み」、連結された文字列のコピーを防ぐことができます。

于 2012-08-25T11:32:03.363 に答える