1

値を変更する必要がある一時変数があり、変更後に古い値にアクセスする必要がないという状況によく遭遇します。

// Find out if the jello will be jiggly
// at a certain time
bool IsJiggly( JelloType jello, float time )
{
    // JelloType has some weird overloads..
    jello = jello + time ; // I don't need the unrefrigerated jello,
    // _so I overwrite jello_..

    return jello.jiggles() ;
}

bool IsJiggly( JelloType jello, float time )
{
    JelloType jello2 = jello + time ; // I don't need the unrefrigerated jello,
    // but I create a new variable anyway, 
    return jello2.jiggles() ;
}

(上記の例はやや不自然であることに気づきました。つまりJelloType、メンバー関数が必要operator+=です..しかし、状況はそうではありません!)

質問は次の とおりです。_C++ では、変数を上書きするか、単に新しい変数を作成してそれを使用する方がパフォーマンス的に優れていますか?_

4

3 に答える 3

1

一時オブジェクトを削除してjiggles機能するまでの時間を渡すことで、コードをより良いコーディングスタイルで拡張できます。また、boolを返すときに名前jigglesを変更します。IsJigllyまた、オブジェクトコピーの代わりにconst参照で十分です(コンパイラがコピーを最適化する可能性がありますか?):

bool IsJiggly(const JelloType& jello, float time )
{
   return jello.IsJiggly(time);
}

少なくともこの関数は、コンパイラがコピーを削除しない場合、両方の関数がより良いパフォーマンスを収集できることと同じです。また、より優れた機能設計、より直感的で保守が容易です。

C ++では、変数を上書きする方がパフォーマンスの面で優れていますか、それとも新しい変数を作成してそれを使用するだけですか?

これは実際には言語に関する問題ではなく、アプリケーションの設計によって異なります。JeloTypeがコピーするのに非常に安価な(参照をコピーするよりも安い)小さなオブジェクトである場合、私はそれをコピーすることを気にしないかもしれません。

于 2013-01-18T23:30:54.273 に答える
1

ほぼすべての場合、コンパイラはおそらく違いを最適化します。

関数を呼び出すだけjelloでコピーされることに注意してください。a をコピーするのJelloTypeが安ければ、問題はありません。コストが高い場合は、代わりに const 参照を渡す必要があります。

一時的なものを導入する 2 番目の例ではjello2、理論的には、別のコピー コンストラクターを呼び出します。これに副作用がある場合、コンパイラはそれを最適化できなくなります。副作用がない場合 (適切なコピー コンストラクターには副作用がないjelloはずです)、コンパイラはおそらく一時的なものを削除できます (引数は既に一時的なコピーであるため)。

たとえば、コピーの名前が理解に役立つ場合など、コピーを作成することが理にかなっている場合があります。コピーによってコードが理解しやすくならない場合、および参照ではなくコピーを渡したために一時的なコピーを既に作成している場合は、おそらくjello2.

于 2013-01-18T23:37:49.323 に答える
0

わかりました、私はノーノーサーと言わなければなりません。

C に対する C++ とプレーン マシン コードに対する C の全体的な考え方は、人間が理解できる「意味」をコードに与え、コンパイラが設計上の決定 (関数の可視性など) を実施できるようにすることです。特に C++ では、変数と関数を「オブジェクト」にグループ化して、実際の問題オブジェクトに関連付けることができます。最適化は、たとえあったとしても、あなたの頭の中で最後のことです。あなたのプロジェクトは、未加工のパフォーマンスよりも、構築の難しさ、バグ、メンテナンスのしにくさによって失敗する可能性が高くなります。

すっごい…。

1) jello が単純なカウンターである場合、確かに、古い値を保存する必要はありません。時間の経過とともに増加することは誰もが知っており、+ が何をするかを知っており、それを使用するときは注意が必要です。jelloTime などと呼ぶことをお勧めします。

2) jello がオブジェクトの場合、NOOO:

Jello は、「実際の」ビジネス オブジェクトに関連するエンティティである必要があります。

a) + は、時間などを追加するために使用してはなりません。誰にもそれを知る方法はなく、ゼリーと時間は私には意味がありません. (私のチームは、有効な答えではないことを知っています)。.addFrozentTime() などと呼ばれるメソッドを追加します。( addTime() は避けてください。まだ明確ではありません…)。

b) また、jello は一部の jello を永遠にエンティティとして参照するため、メソッドはオブジェクトの ID を変更することはなく、その状態のみを変更します。(フライウェイトは例外ですが、それはここでは重要ではありません) したがって、次のいずれかです。

B1) あなたのコメントは間違っています:

// 冷蔵されていないゼリーは必要ありません

異なる状態の同じオブジェクトです。「ゼリーは冷蔵されました」と言って、変数を保持します…</p>

または

B2) コードが間違っています:

ゼリー=ゼリー+時間

  • もちろん、新しいオブジェクトに古い変数を再利用しないでください! 後で誰かが来て、間違ったオブジェクトで jello,xxx を呼び出すことができなくなります。

したがって、答えは「場合による」ですが、どちらにしてもコードを修正する必要があります。

私の2 cts私はただ助けるつもりです。

于 2013-01-19T00:53:32.757 に答える