これが意図した動作であるかどうかはわかりませんが(そうである場合は、申し訳ありませんが、この問題を閉じてください)、これは明らかに許可されるべきではありません!
私たちに言わせてください、
1)変数foo
の値をデフォルトで1にしたいのですが、
2)そして、ユーザーが何らかの方法で対話すると(入力としましょう)、その値が変更されます。
3)ユーザーが完了した後、 foo
の値は再び1の値を持つ必要があります。
ここで何が起こるかというと、 setget
関連付けられた関数は、値がすでに1の場合、値が1に設定されるたびに呼び出され、元の値が異なる場合は1回(初回)呼び出す必要があります。 これは私にとってパフォーマンスをいくらか殺している、私はこれを行うことができることを知っている:
if (new_value == old_value):
return
ただし、これは自動的に実行する必要があります。
これを自動的に行うのは良い考えではないと思います。 すでに持っているのと同じ値で変数を設定しても、パフォーマンスに影響はありません。これは、必要に応じてsetget
関数が処理する必要があるものです。 また、値チェックを追加すると、1つの新しい(概念的には不要な)分岐であるため、パフォーマンスに影響します。
また、同じ値を設定してもセッターに影響がないため、バイパスできるとは思いません。
これは、毎回1つの値を設定すると、このようなパフォーマンスが低下する可能性がある場合、非常に複雑なセッターがあるように見えます。
さて、通常、自己割り当てだけを行う場合は問題ありませんが、「setget」とは何かのように、新しい値を割り当てるよりも多くの作業を行うと、パフォーマンスが低下します。 特に、値が変更されず、フレームごとに自己割り当てされる場合。
その上、(私が知っている)すべてのC ++コンパイラは、そのような残虐行為からあなたを守ります。 (少なくとも基本的なタイプでは、この保護を無効にしている割り当て演算子をオーバーロードします)実際、amd cpusでの浮動小数点数の自己割り当て後、値が同じままであるかどうかを確認するために、いくつかのコードがそれをチェックすることを表明しています。 これは、あるプロジェクトの健全性チェックとして行われたもので、その名前を忘れてしまいました。
簡単な回避策がある場合、私の意見では古いコードを壊す価値はありません(同じ値の割り当ての試行についてユーザーに通知を表示するためにセッターを利用するコードがあります)。
最も参考になるコメント
簡単な回避策がある場合、私の意見では古いコードを壊す価値はありません(同じ値の割り当ての試行についてユーザーに通知を表示するためにセッターを利用するコードがあります)。