2013-03-14 70 views
19

動態方法如何提高代碼大小?
什麼代碼大小意味着?這意味着program.exe文件的大小?動態和虛擬方法有什麼區別?

根據手冊:

一般情況下,虛方法是實現 多態行爲的最有效方式。當一個基類 聲明是由許多 派生類在應用程序中繼承許多重寫的方法,但只是偶爾 覆蓋動態方法是有用的。

I增益如果當只有繼承類的一個覆蓋的方法我使用動態的,而不是虛擬的,因爲手動還表示:

虛擬方法優化速度,而動態方法優化代碼大小。

+0

兩個引號告訴你,你需要知道的。底線是,在我看來,總是使用虛擬。 – 2013-03-14 18:05:29

+0

@DavidHeffernan張貼編輯! – EProgrammerNotFound 2013-03-14 18:07:17

回答

38

虛擬方法與虛擬方法表(VMT)來實現。每個班級有一個VMT。 VMT爲類中的每個虛擬方法包含一個條目。該條目是該方法的地址。

這樣就可以非常有效的呼叫。您只需獲取位於與Self固定偏移量的VMT的地址。然後通過索引查找方法指針並調用方法。

什麼這是否意味着是,如果你有很多的虛擬方法的類,你得到一個子類,你會做一個全新的VMT所有的虛方法。如果你沒有覆蓋很多,那麼你會發現VMT有很多重疊。

這適用於16位的天無關緊要。 VMT可能會佔用可執行映像中的大量空間(這就是代碼大小),並且VMT可能會用盡空間。所以引入了動態方法。與VMT類似的是動態方法表DMT。這是以不同的方式實現的,以避免重寫方法時的重複。缺點是調用動態方法會更昂貴。

到了近代,由於32位,特別是與很肥的可執行文件,德爾福產生,這些大小問題並不重要。所以所有的建議都是純粹使用虛擬方法。

虛擬方法表的實現是很好理解的,有許多文獻可以發現,以瞭解他們。對於那些相當古怪的動態方法來說,情況並不那麼如此。我發現最好的信息來源是Hallvard Vassbotn的博客:

+0

+1與最新的Delphi版本生成的巨大可執行文件大小進行比較時,動態增益確實是徒勞的。 – 2013-03-14 19:54:43

+2

+1非常好的解釋!非常感謝!!我將閱讀整篇文章 – EProgrammerNotFound 2013-03-14 19:59:28

+4

如果DMT將被排序(由編譯器),那麼Delphi中的DMT實現(主要用於調度窗口消息)可能會更快,因此可以使用二進制搜索而不是線性搜索找到方法指針。 – 2013-03-14 21:05:04

相關問題