C ++クラス(またはその親クラスのいずれか)に少なくとも1つの仮想メソッドがあることは、クラスに仮想テーブルがあり、すべてのインスタンスに仮想ポインターがあることを意味します。
したがって、メモリコストは非常に明確です。最も重要なのは、インスタンスのメモリコストです(特に、インスタンスが小さい場合、たとえば、単に整数を含めることを意図している場合)。この場合、すべてのインスタンスに仮想ポインタがあると、インスタンスのサイズが2倍になる可能性があります。仮想テーブルが使用するメモリ領域。実際のメソッドコードが使用する領域と比較すると、通常は無視できると思います。
これは私に私の質問をもたらします:メソッドを仮想化するために測定可能なパフォーマンスコスト(つまり速度への影響)はありますか?すべてのメソッド呼び出し時に、実行時に仮想テーブルでルックアップが行われるため、このメソッドへの呼び出しが非常に頻繁であり、このメソッドが非常に短い場合、測定可能なパフォーマンスヒットがある可能性があります。それはプラットフォームに依存すると思いますが、誰かがいくつかのベンチマークを実行していますか?
私が尋ねている理由は、プログラマーが仮想メソッドの定義を忘れているために起こったバグに遭遇したからです。私がこの種の間違いを見たのはこれが初めてではありません。そして、私はそれが必要でないことが確実であるときに仮想キーワードを削除するのではなく、なぜ必要なときに仮想キーワードを追加するのかと考えました。パフォーマンスコストが低い場合は、チームで以下をお勧めします。デストラクタを含むすべてのメソッドをデフォルトで仮想化し、すべてのクラスで、必要な場合にのみ削除します。気が狂ってる?