假設我有一個類B_Impl繼承并實作了一個純抽象類B(不包含任何資料欄位)。
假設類僅A使用B_Implvia B*。
如果我添加一個欄位B_Impl.h(顯然,不包含在 中A),是否會保留 ABI 兼容性?
我認為,它不會被保留——在閱讀https://wiki.qt.io/D-Pointer之后。
但我可以在我的應用程式中看到,更改后,類的B_Impl.h目標檔案沒有重新生成,一切仍然很好。A
也許,這是因為在我的應用程式中A并且B是同一個應用程式的一部分,而B不是由 ? 呼叫的庫A?或者是因為它vtable總是位于記憶體中的第一個欄位并且添加另一個欄位B_Impl.h(即“下方” B)不會改變vtable第一個欄位的事實?還是聯結器以某種方式糾正了這些東西,而不是通過重新生成A-object-file?
老實說,我在這里有點困惑:
這個 ABI 問題僅與庫有關嗎?
B*當我呼叫并通過更改獲得一些段錯誤B_Impl.h(即通過忽略文章中建議的 Pimpl 原則)而不是重新生成時,如何調整我的應用程式中的情況(其中 A 使用 B 不作為庫)A-目標檔案?或者,如果我通過介面使用一個類,我可以通過添加新欄位等來盡可能多地
B*改變它,而不用擔心我將不得不重新編譯直接在同一個應用程式中使用的類或重新編譯用作對共享庫的呼叫?感謝您的關注!B_Impl.hABCB
uj5u.com熱心網友回復:
如果我向 B_Impl.h 添加一個欄位(顯然,不包含在 A 中),是否會保留 ABI 兼容性?
是的。如果翻譯單元不包含 的定義B_Impl,則對 的更改B_Impl不會影響兼容性。
介面兼容性——無論是 API 還是 ABI——只在使用介面時才重要。在您的示例中,B使用了介面;不是的介面B_Impl。
這個 ABI 問題僅與庫有關嗎?
是否B_Impl在圖書館里并不重要。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/444260.html
標籤:C 汇编 链接器 阿比 pimpl-idiom
