動態方法如何提高代碼大小?
什麼代碼大小意味着?這意味着program.exe文件的大小?動態和虛擬方法有什麼區別?
根據手冊:
一般情況下,虛方法是實現 多態行爲的最有效方式。當一個基類 聲明是由許多 派生類在應用程序中繼承許多重寫的方法,但只是偶爾 覆蓋動態方法是有用的。
I增益如果當只有繼承類的一個覆蓋的方法我使用動態的,而不是虛擬的,因爲手動還表示:
虛擬方法優化速度,而動態方法優化代碼大小。
動態方法如何提高代碼大小?
什麼代碼大小意味着?這意味着program.exe文件的大小?動態和虛擬方法有什麼區別?
根據手冊:
一般情況下,虛方法是實現 多態行爲的最有效方式。當一個基類 聲明是由許多 派生類在應用程序中繼承許多重寫的方法,但只是偶爾 覆蓋動態方法是有用的。
I增益如果當只有繼承類的一個覆蓋的方法我使用動態的,而不是虛擬的,因爲手動還表示:
虛擬方法優化速度,而動態方法優化代碼大小。
虛擬方法與虛擬方法表(VMT)來實現。每個班級有一個VMT。 VMT爲類中的每個虛擬方法包含一個條目。該條目是該方法的地址。
這樣就可以非常有效的呼叫。您只需獲取位於與Self
固定偏移量的VMT的地址。然後通過索引查找方法指針並調用方法。
什麼這是否意味着是,如果你有很多的虛擬方法的類,你得到一個子類,你會做一個全新的VMT所有的虛方法。如果你沒有覆蓋很多,那麼你會發現VMT有很多重疊。
這適用於16位的天無關緊要。 VMT可能會佔用可執行映像中的大量空間(這就是代碼大小),並且VMT可能會用盡空間。所以引入了動態方法。與VMT類似的是動態方法表DMT。這是以不同的方式實現的,以避免重寫方法時的重複。缺點是調用動態方法會更昂貴。
到了近代,由於32位,特別是與很肥的可執行文件,德爾福產生,這些大小問題並不重要。所以所有的建議都是純粹使用虛擬方法。
虛擬方法表的實現是很好理解的,有許多文獻可以發現,以瞭解他們。對於那些相當古怪的動態方法來說,情況並不那麼如此。我發現最好的信息來源是Hallvard Vassbotn的博客:
+1與最新的Delphi版本生成的巨大可執行文件大小進行比較時,動態增益確實是徒勞的。 – 2013-03-14 19:54:43
+1非常好的解釋!非常感謝!!我將閱讀整篇文章 – EProgrammerNotFound 2013-03-14 19:59:28
如果DMT將被排序(由編譯器),那麼Delphi中的DMT實現(主要用於調度窗口消息)可能會更快,因此可以使用二進制搜索而不是線性搜索找到方法指針。 – 2013-03-14 21:05:04
兩個引號告訴你,你需要知道的。底線是,在我看來,總是使用虛擬。 – 2013-03-14 18:05:29
@DavidHeffernan張貼編輯! – EProgrammerNotFound 2013-03-14 18:07:17