CTest::Proc 関数で、m_pClassAを3回参照しています。
もし、m_pClassA の値が関数内で変わることがないのであれば、m_pClassA
をローカル変数にコピーして、それを参照するようにしたのが
List2 です。
|
List2 |
void CTest::Proc()
{
CClassA* const pClassA = m_pClassA; // ローカル変数にコピー
pClassA->SetNumber(1);
pClassA->SetCount(2);
pClassA->Proc();
}
|
なぜ、わざわざローカル変数にコピーする必要があるかというと、上記コードは実は以下のコード
list3 と同等ですの意味です。 |
List3 |
void CTest::Proc()
{
CClassA *pClassA;
pClassA = this->m_pClassA
pClassA->SetNumber(1);
pClassA = this->m_pClassA
pClassA->SetCount(2);
pClassA = this->m_pClassA
pClassA->Proc();
}
|
コンパイラは、変数m_pClassAが保持するCClassAのポインタを、毎回読み直すコードを吐きます。
そのため、プログラマがそれをさせないコードにすればムダは省けます。
賢いコンパイラならこの程度の最適化は勝手にしてくれると考えるかもしれませんが、この場合はされません。
コンパイラは、
m_pClassA->SetNumber(1);
という関数の中で、CTest::m_pClassA
が変更される可能性がある為 m_pClassA
をキャッシュしておくことはしません。
その為、次に m_pClassA
を参照する場合も律儀に読み直す必要があるのです。
|
|