仮想関数は一般的に遅いと認識されているようである。その実際はいかがなものであろうか。仮想関数テーブルに呼び出すアドレスが格納されている。クラスはインスタンスを生成すると、非スタティックメンバ変数及び、仮想関数テーブルへのポインタがメモリに確保される。これによりインスタンスが基底クラスのポインタにキャストされても呼び出すべき関数を正しく認識することができる。普通のメンバ関数は、コンパイル時に呼び出すべき関数が特定できるため、メモリの値を経由して呼び出すなどということは無い。各々の呼び出しのプロセスVCでは、仮想関数テーブルへのポインタは確保されたメモリの先頭に置かれる。仮想関数テーブルにより関数呼び出し(_aは実際にはレジスタまたはアドレス、regは何らかのレジスタ)のようにコンパイルされる。メンバ関数呼び出しのようにコンパイルされます。関数呼び出しのコードは1クロックで完了してしまう。(いや...調べたわけじゃないんで...適当)ただし、実際にはそんな短時間で処理が完了することはまず無い。この辺にはキャッシュが関係してくる。普通のメンバ関数だと3クロックで呼び出し、リターンが完了する。普通のメンバ関数で、条件同じく、213-915クロック、平均467.1クロックこの差は各呼び出しに於けるメモリ参照回数によるものだろう。先のコードを参照して頂くとして、メモリ参照回数は、仮想関数では2回、普通のメンバ関数は0回である。各1回参照回数は増え、結局は3回と1回になるものと思われる。実際のところ、前回実行時のデータが完全にキャッシュに残っていて11クロックないし3クロックで関数呼び出し及びリターンが完了するのはまずありえないであろう。仮想関数は遅いという認識はある意味では正しく、またある意味では正しくない。呼び出す関数が小さく、またそのそこでアクセスするメモリの範囲が狭く、さらに、連続的に呼び出す場合は回数が多くても仮想関数使用に際するオーバーヘッドは小さいものであると思われる。等は、ここが速度のボトルネックなるかもしれない。結局のところ試行錯誤して仮想関数にするか否かを決めるしかないような気も。2001(しまった...短くまとめすぎた...)。