4

私はC++でコーディングしています。sを文字列とします。次のうちどれが速いかを判断するように求められます。

cout << "s:"  + s  + "s:"  + s  + " s:"  + s  + "\n";

cout << "s:" << s << "s:" << s << " s:" << s << "\n";

両方を繰り返し実行して、2番目の方が速いことを確認しました。私はその理由を理解しようとしばらく時間を費やしました。最初のものでは、文字列が最初に連結されてから画面に出力されるためだと思います。しかし、2番目のものは画面に直接出力されます。あれは正しいですか?

4

4 に答える 4

4

1つ目は、文字列連結のためのいくつかのメモリ割り当てを伴う可能性があり、その後に、最終的な連結文字列を出力バッファにコピーします。2つ目は、すでに割り当てられている文字列データを、すでに割り当てられている出力バッファにコピーするだけです。

于 2012-11-13T03:11:52.073 に答える
0

理論的な観点から、2番目の例は線形時間ですが、最初の例は実装に応じて2次時間(サブストリングの数)にすることができます。

それがあなたの実装に当てはまるかどうかを判断するには、ソースコードを調べ、(コンパイラが最適化する可能性があるため)マシンコードを調べる必要があります。

要するに、理由は実装に依存し、一般に、「どちらが最速か」を判断するには、MEASUREを選択するしかありません。「理由」は、ヒューリスティックなガイドラインとして機能します。しかし、それだけです。最終的に重要なのは、測定値、現実です。

于 2012-11-13T03:11:35.460 に答える
0

最初に文字列オブジェクトを作成するため、2番目の方が速いという仮説はおそらく正しいでしょう。ここでの鍵は「ありそう」です。これらはstdライブラリ関数であり、標準が動作を定義し、実装方法ではないため、実装の詳細が異なる場合があります。理論的には、結果の反対が当てはまる標準ライブラリの実装を見つけることができます。

于 2012-11-13T03:14:28.023 に答える
0

完全な記述については、前の質問からのこの回答を見てみたいと思います:C++での効率的な文字列連結

于 2012-11-13T03:20:02.517 に答える