-3

誰かが私にどのコードが速いか説明したいですか?文字列の割り当てを最適化するための最良の方法は何ですか?

コード1:

std::string result;

int main()
{
   for(int i=0;i<1000;i++)
   {
   /*some code*/
   result = stringVar;
   /* some code using result */
   }
}

コード2:

int main()
{
   for(int i=0;i<1000;i++)
   {
   /*some code*/
   std::string result = stringVar;
   /* some code using result */
   }
}

そして、値を割り当てるには:

std::string var;

var.assign("value");
//or
var="value";

そして、新しい値を追加する前に、値によって使用されていたメモリを解放することは可能ですか?

あなたが私がそれを理解するのを手伝ってくれるならありがとう:)

4

3 に答える 3

2

の場合:

for (...)
    std::string result = blah;

コンパイラは、forループを介して毎回結果を構築および破棄する必要があり、おそらくヒープの割り当てと割り当て解除の呼び出しが必要になります。

の場合:

std::string result;
for (...)
    result = blah;

文字列の実装では、結果の現在のバッファに収まるほど大きい場合にのみ、再割り当てによってヒープの割り当てと割り当て解除を最適化できる可能性があります。

var = xとvar.assign(x)は同じコードになるはずです。どちらにしても、大きな違いはないと思います。

于 2012-10-27T21:37:59.223 に答える
1

最初のパスは、前のパスから割り当てられたメモリを再利用できるため、おそらく多少高速です。2つ目は、ループを通過するたびに文字列を破棄するため、文字列のコンテンツ用にストレージを解放します。ループ本体で定義されているにもかかわらず、オブジェクトを保持するオプティマイザーは、言語規則に違反しています。

于 2012-10-27T21:38:17.333 に答える
1

コード1では、operator=が呼び出されます。これは通常、一時オブジェクトを作成し(コピーコンストラクターを使用)、一時オブジェクトの内臓をlhsオブジェクトと交換することで実装されます。したがって、コピーコンストラクター、スワップ、および一時オブジェクトの削除(メソッドのoperator=()終了時)はコード1で実行されます。

コード2では、コピーコンストラクターが呼び出され、最後にforループパスが終了するとオブジェクトが削除されます。

したがって、コード1には、文字列クラスの内臓を交換するという追加の手順があります。一部の文字列ライブラリでは、の実装がoperator=上記のようになっていない可能性がありますが、ご使用の環境でテストすることをお勧めします。

于 2012-10-28T00:44:40.853 に答える