2013-03-14 35 views
19

ダイナミックメソッドがコードサイズを改善する方法
コードサイズとは?これは、program.exeファイルのサイズを意味しますか?動的メソッドと仮想メソッドの違いは何ですか?

マニュアルよると:一般的に

を、仮想メソッドは 多型動作を実装するための最も効率的な方法です。動的メソッドは、アプリケーション内の多くの 子孫クラスによって継承される多くのオーバーライド可能なメソッドが宣言されているが、たまには がオーバーライドされる場合に、基底クラス が宣言されている場合に便利です。動的メソッドは、最適化しながら、

仮想メソッドは、スピードを最適化:継承されたクラスの一方のみがメソッドをオーバーライドするとき、私は代わりに仮想の動的な使用している場合は、手動でも言うので、私は、得る何

コードサイズ。

+0

2重引用符は、あなたが知っておくべきことを教えてくれ。ボトムラインは、私の見解では、常に仮想を使用しています。 –

+0

@DavidHeffernan投稿編集されました! – EProgrammerNotFound

答えて

38

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

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

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

これは16ビット時代の問題でした。 VMTは、実行可能イメージ(コードサイズの意味)に多くの領域を占有し、VMTの領域を使い果たす可能性があります。ダイナミックなメソッドが導入されました。 VMTのアナログは、動的メソッドテーブルDMTです。これは、メソッドがオーバーライドされないときの繰り返しを避けるために、別の方法で実装されています。欠点は動的メソッドを呼び出すほうが高価だということです。

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

仮想メソッドテーブルの実装はよく理解されており、それらを理解するための参照が多数見つかります。それはあまり風変わりではないダイナミックな方法にとってはそうではありません。私が見つけた最良の情報源はHallvard Vassbotnのブログからです:

+0

+1最新のDelphiバージョンで生成された膨大な実行可能ファイルサイズと比較すると、動的利得は無駄になります。 –

+2

+1とてもいい説明です!どうもありがとうございます!!私は全文を読むでしょう – EProgrammerNotFound

+4

DMTが(コンパイラによって)ソートされるならば、DelphiのDMT実装(主にウィンドウメッセージをディスパッチするために使われる)は、DMTが線形メソッドポインタを探すための検索。 –

関連する問題