22

動的メソッドはコードサイズをどのように改善しますか?
コードサイズとはどういう意味ですか?それはprogram.exeファイルサイズを意味しますか?

マニュアルによると:

一般に、仮想メソッドは、ポリモーフィックな動作を実装するための最も効率的な方法です。動的メソッドは、基本クラスが、アプリケーション内の多くの子孫クラスに継承される多くのオーバーライド可能なメソッドを宣言する場合に役立ちますが、オーバーライドされるのはたまにしかありません。

マニュアルにも次のように記載されているため、継承されたクラスの1つだけがメソッドをオーバーライドするときに、仮想ではなく動的を使用すると何が得られますか。

仮想メソッドは速度を最適化し、動的メソッドはコードサイズを最適化します。

4

1 に答える 1

42

仮想メソッドは、仮想メソッドテーブル(VMT)を使用して実装されます。クラスごとに1つのVMTがあります。VMTには、クラス内の仮想メソッドごとに1つのエントリが含まれています。そして、そのエントリはメソッドのアドレスです。

これにより、非常に効率的な呼び出しが可能になります。から固定オフセットにあるVMTのアドレスを取得するだけですSelf。次に、インデックスでメソッドポインタを検索し、メソッドを呼び出します。

これが意味するのは、多くの仮想メソッドを持つクラスがあり、サブクラスを派生させる場合、すべての仮想メソッドを持つまったく新しいVMTを作成するということです。そして、それらの多くをオーバーライドしていない場合は、VMTに多くのオーバーラップがあることがわかります。

これは16ビットの時代には問題でした。VMTは、実行可能イメージで多くのスペースを占有する可能性があり(これは、コードサイズの意味です)、VMTのスペースが不足する可能性があります。そこで、動的な方法が導入されました。VMTに類似しているのは、動的メソッドテーブルDMTです。これは、メソッドがオーバーライドされない場合の繰り返しを回避するために、異なる方法で実装されます。欠点は、動的メソッドの呼び出しがより高価になることです。

現代では、32ビット以降、特にDelphiが生成する非常に太い実行可能ファイルでは、これらのサイズの問題は問題になりません。したがって、すべての適切なアドバイスは、仮想メソッドを排他的に使用することです。

仮想メソッドテーブルの実装はよく理解されており、それらを理解するための多くのリファレンスを見つけることができます。かなり趣のある動的メソッドの場合はそれほどではありません。私が見つけた最高の情報源は、HallvardVassbotnのブログからです。

于 2013-03-14T19:24:23.800 に答える