使用抽象 class 没有疙瘩的 C++ abi 兼容性
C++ abi compatability without pimpl using abstract class
假设我有一个 class B_Impl
继承并实现了纯抽象 class B
(不包含任何数据字段)。
假设 class A
仅通过 B*
使用 B_Impl
。
如果我向 B_Impl.h
添加一个字段(很明显,A
不包括),是否会保留 ABI 兼容性?
我认为,它不会被保留,- 阅读后 https://wiki.qt.io/D-Pointer。
但我可以在我的应用程序中看到,在更改 B_Impl.h
之后,class A
的对象文件 未 重新生成,所有内容仍然很好用。
也许,这是因为在我的应用程序中 A
和 B
是同一个应用程序的一部分,而 B
不是 A
调用的库?或者是因为 vtable
始终位于内存中的第一个字段并且向 B_Impl.h
添加另一个字段(在 B
“下方”)不会改变 vtable
是第一个字段?还是链接器以某种方式纠正了这些东西,而不是通过重新生成 A
-object-file?
老实说,我在这里有点困惑:
这个 ABI 问题是否只与库有关?
当我调用 B*
并通过更改 B_Impl.h
获得一些段错误时,如何调整我的应用程序中的情况(A 使用 B 而不是库) ,(即忽略文章中建议的 Pimpl 原则),而不是重新生成 A
-object-file?
或者如果我通过接口 B*
使用 class 我可以通过添加新字段等来尽可能多地更改它的 B_Impl.h
是真的吗.而且不用担心我将不得不重新编译直接在同一个应用程序中使用 B
的 A
或重新编译使用 B
作为调用的 C
共享图书馆?谢谢关注!
If I add a field to B_Impl.h (clearly, not included by A), will ABI compatability be preserved?
是的。如果翻译单元不包含 B_Impl
的定义,则更改为 B_Impl
不会影响兼容性。
接口兼容性 - 无论是 API 还是 ABI - 仅在使用接口时才重要。在您的示例中,使用了 B
的接口;不是 B_Impl
.
的界面
Is this ABI problem is only about libraries?
B_Impl
是否在图书馆应该无关紧要。
假设我有一个 class B_Impl
继承并实现了纯抽象 class B
(不包含任何数据字段)。
假设 class A
仅通过 B*
使用 B_Impl
。
如果我向 B_Impl.h
添加一个字段(很明显,A
不包括),是否会保留 ABI 兼容性?
我认为,它不会被保留,- 阅读后 https://wiki.qt.io/D-Pointer。
但我可以在我的应用程序中看到,在更改 B_Impl.h
之后,class A
的对象文件 未 重新生成,所有内容仍然很好用。
也许,这是因为在我的应用程序中 A
和 B
是同一个应用程序的一部分,而 B
不是 A
调用的库?或者是因为 vtable
始终位于内存中的第一个字段并且向 B_Impl.h
添加另一个字段(在 B
“下方”)不会改变 vtable
是第一个字段?还是链接器以某种方式纠正了这些东西,而不是通过重新生成 A
-object-file?
老实说,我在这里有点困惑:
这个 ABI 问题是否只与库有关?
当我调用
B*
并通过更改B_Impl.h
获得一些段错误时,如何调整我的应用程序中的情况(A 使用 B 而不是库) ,(即忽略文章中建议的 Pimpl 原则),而不是重新生成A
-object-file?或者如果我通过接口
B*
使用 class 我可以通过添加新字段等来尽可能多地更改它的B_Impl.h
是真的吗.而且不用担心我将不得不重新编译直接在同一个应用程序中使用B
的A
或重新编译使用B
作为调用的C
共享图书馆?谢谢关注!
If I add a field to B_Impl.h (clearly, not included by A), will ABI compatability be preserved?
是的。如果翻译单元不包含 B_Impl
的定义,则更改为 B_Impl
不会影响兼容性。
接口兼容性 - 无论是 API 还是 ABI - 仅在使用接口时才重要。在您的示例中,使用了 B
的接口;不是 B_Impl
.
Is this ABI problem is only about libraries?
B_Impl
是否在图书馆应该无关紧要。