4

オープン ソース コード ( OpenCVから) を参照しているときに、メソッド内に次のタイプのコードを見つけました。

// copy class member to local variable for optimization
int foo = _foo; //where _foo is a class member

for (...) //a heavy loop that makes use of foo

SOに関する別の質問から、これが実際に実行される必要があるかどうか、またはコンパイラによって自動的に実行されるかどうかに対する答えは、コンパイラ/設定に依存する可能性があると結論付けました。

_foo私の質問は、staticクラスのメンバーだった場合に違いがあるかどうかです。この手動の最適化にはまだポイントがありますか、それとも静的クラスメンバーへのアクセスはローカル変数へのアクセスよりも「高価」ではありませんか?

PS - 特定の問題を解決するためではなく、好奇心からお願いしています

4

4 に答える 4

6

Accessing a property means de-referencing the object, in order to access it.

As the property may change during the execution (read threads), the compiler will read the value from memory each time the value is accessed.

Using a local variable will allow the compiler to use a register for the value, as it can safely assume the value won't change from the outside. This way, the value is read only once from memory.

About your question concerning the static member, it's the same, as it can also be changed by another thread, for instance. The compiler will also need to read the value each time from memory.

于 2013-01-20T12:39:26.677 に答える
4

ローカル変数は、関数に対してローカルであるという理由だけで、何らかの最適化に参加する可能性が高いと思います。この事実は、コンパイラによって使用できます。たとえば、誰もローカル変数を変更していないことがわかった場合、コンパイラはそれをロードする可能性がありますonce、すべての反復で使用します。

メンバー データの場合、コンパイラは、誰もメンバーを変更しないと結論付けるために、さらに作業する必要がある場合があります。マルチスレッド アプリケーションについて考えてみましょう。C++11 のメモリ モデルはマルチスレッドであることに注意してください。これは、他のスレッドがメンバーを変更する可能性があることを意味します。そのため、コンパイラは誰もそれを変更していないと結論付けない可能性があり、その結果、発行する必要があります。メンバーの更新された値を操作するために、それを使用するすべての式のロードメンバーのコード。

于 2013-01-20T12:39:59.163 に答える
0

この例では、_fooが新しいローカル変数にコピーされます。したがって、どちらの場合も同じです。統計値は他の変数と同じです。静的メモリ専用の別のメモリセグメントに格納されているだけです。

于 2013-01-20T13:47:22.357 に答える
-1

静的クラスメンバーの読み取りは、事実上、グローバル変数の読み取りに似ています。どちらも固定アドレスです。非静的なものを読み取るということは、最初にthisポインターを読み取り、結果にオフセットを追加してから、そのアドレスを読み取ることを意味します。言い換えると、非静的なものを読み取るには、より多くのステップとメモリアクセスが必要です。

于 2013-01-20T15:10:36.563 に答える