メニュー
ブログ更新履歴
コンテンツ更新履歴
リンク
  • 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 を参照する場合も律儀に読み直す必要があるのです。


トップ   凍結 差分 バックアップ 複製 名前変更 リロード印刷に適した表示   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom Powered by xpWiki
Counter: 743, today: 1, yesterday: 1
初版日時: 2005-12-25 (日) 08:43:00
最終更新: 2005-12-25 (日) 08:43:00 (JST) (989d) by takatsuka