看了一篇文章:避免使用虛函式作為庫的介面
其中提到c++虛表的僵硬,導致版本更新時二進位制相容性的問題。
其實這個問題不是c++的問題,而是c++實現的問題。如果介面的二進位制相容性是乙個強制需求,在不影響執行效率的情況下,c++是完全可以實現的,不過需要多一點的空間開銷和初始化開銷。
具體的方法可以參考 pe 檔案中的 import table 和 export table。
具體的演算法,在 pe 檔案中,import table 中的項一般比相應 dll 的 export table 項少得多,所以,它使用二分查詢(當然,它還有很多優化,如 hint, by ordinal,bound import 等等)。對於虛函式的情形,因為 import 和 export 的項數差不多,使用 merge 演算法會更快一點。
以前在做嵌入式系統的時候,會把絕大部分函式都放到查詢表中,也是類似的道理,因為 rom 最便宜,然而 rom 是 read only memory,release 之後,客戶買到產品,要修改怎麼辦?還好,系統中不是光有rom,還要少量 eeprom,於是,事情就好辦了,查詢表和 fix 的新**,都可以放到 eeprom 中,只需要在更新系統時將 fix 的新函式位址填入查詢表中相應的位置。
如果c++哪天要統一abi,這樣的東西應該是必不可少的。
C 如何動態庫實現介面相容
看了一篇文章 避免使用虛函式作為庫的介面 其中提到c 虛表的僵硬,導致版本更新時二進位制相容性的問題。其實這個問題不是c 的問題,而是c 實現的問題。如果介面的二進位制相容性是乙個強制需求,在不影響執行效率的情況下,c 是完全可以實現的,不過需要多一點的空間開銷和初始化開銷。具體的方法可以參考 pe...
C 如何實現介面事件
在類中宣告事件,然後在相應區域中呼叫它。namespace implementinte ceevents public class myeventargs eventargs public class shape idrawingobject protected virtual void onsha...
C 動態鏈結庫介面選擇
陳碩在 c 工程實踐經驗談 在二進位制相容性和避免使用虛函式作為庫的介面兩節中說到com使用虛函式暴露介面的做法破壞了動態鏈結庫的二進位制相容性 1.為什麼需要動態鏈結庫 假設我們開發了乙個圖形庫 我們要將我們的庫發布出去無非有以下幾種方式 1 原始碼 這種方式最直接,但是有兩個比較明顯的缺點 暴露...