2010-01-02 (土)
*C++のvtableが憎い
ポインタを介さないアクセスの場合は,仮想関数テーブルを見る必要が無いので,メソッド呼び出し時のオーバーヘッドはありません.
が,インスタンス生成時は別で,オブジェクトの先頭にvtableを埋め込む処理が入ります.
これが厄介で,ごく単純な処理の場合は賢いコンパイラはvtable自体の存在を忘れてくれますが,配列だったりすると全ての要素にvtableを埋め込んでくれます.
Nanika o[16];
とかすると,Nanikaは初期化不要でコンストラクタも無いのに16回のループが発生してしまいます.ポインタ経由でアクセスする可能性があるなら仕方ない処理なのですが,その場所ではその仮想関数テーブルは使われないのです.
遅いと困る箇所だったので,テンプレートで実装したのに,クラスの宣言自体にvirtualがあると,無駄な処理が発生してしまいます.
とりあえず,Nanikaのvirtualが無い版を作って無理やり解決したけど,どうにかならないのかなあ.今回の場合は,データと処理を別クラスにする方が結果として綺麗になりそうだけど,後から変えるのは面倒.
もう少し,仮想関数とテンプレートを簡単に併用できるようにして欲しいな.