メニュー
ブログ更新履歴
コンテンツ更新履歴
リンク
  • Magome
  • クラウドベースのMIDIシーケンサ
    音楽制作に興味のある方を対象に、スタンドアロンでも使え、ネットならではの面白さも兼ね備えた音楽制作アプリの提供を目指しています。
twitter

関数の中で、同じメンバ変数を何度も参照するような場合、ローカルにコピーしたほうが処理は早い場合が多いです。
例えば List1 のようなコードがあったとします。

  • List1
    class CTest
    {
    private:
    	CClassA *m_pClassA;
    public:
    	void Proc();
    }
    
    void CTest::Proc()
    {
    	m_pClassA->SetNumber(1);
    	m_pClassA->SetCount(2);
    	m_pClassA->Proc();
    }

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();
    }

なぜ、わざわざローカル変数にコピーする必要があるかというと、List1 は実は以下のコード 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 を参照する場合も律儀に読み直す必要があるのです。


Front page   Freeze Diff Backup Copy Rename ReloadPrint View   New Page Page list Search Recent changes   Help   RSS of recent changes (RSS 1.0) RSS of recent changes (RSS 2.0) RSS of recent changes (RSS Atom) Powered by xpWiki
Counter: 1011, today: 1, yesterday: 1
Princeps date: 2005-12-25 (Sun) 08:43:00
Last-modified: 2005-12-25 (Sun) 08:43:00 (JST) (1237d) by takatsuka