目的
了解二进制兼容, 以及对应保证使用二进制兼容时程序如何去做的。
什么是二进制兼容
二进制兼容(Binary Compatibility)是一个软件工程中的概念,它指的是在软件组件(如库、框架或操作系统服务)的更新过程中,新版本的组件能够与旧版本保持一定程度的互换性,即不需要重新编译那些依赖于该组件的应用程序或其它库,就能保证这些程序或库正常运行并发挥预期功能。
举个例子:
提供了一个dll的exe使用,突然改变了一下这个dll,这时如果exe不重新编译,使用新的dll也不会出问题,那么就可以说这个dll是二进制兼容的。
如何会导致二进制不兼容
二进制不兼容的根本原因是因为升级dll,导致与旧的对比其内存模型发生了改变。
- 增加虚函数,会造成 vtbl 里的排列变化。(不要考虑“只在末尾增加”这种取巧行为,因为你的 class 可能已被继承。)
- 改变虚函数声明顺序
- 增加非静态属性。
- 调整非静态属性的声明顺序
- 给函数增加默认参数,现有的可执行文件无法传这个额外的参数
- 增加默认模板类型参数
template<typename T