我知道过度使用内联函数可能会影响二进制升级。当可升级性很重要时,必须避免这种情况。但是,我无法弄清楚内联如何影响二进制兼容性。拜托,有人可以说明这一点。
答案 0 :(得分:3)
在声明函数,变量和类型(也称为“符号”)时,还应将它们声明为已导出。不同的编译器以不同的方式实现这一点(Visual Studio uses __declspec(dllexport)
(以及其他一些我懒得谷歌的方法)而GCC uses various Visibility switches。我相信clang使用GCC语义(或相对兼容)而且我是不熟悉其他编译器导出符号的方法。
如果你内联你的函数并且它实际上被内联(如果你把它声明为可导出的符号,我会认为这是一个编译器错误)那么你如何从外面调用它你的图书馆?作为函数内联过程的一部分,编译器通常会删除或重写prologue和epilogue指令,因为它们不再需要(例如,不再需要x86上的retn
- 只需将返回值存储在注册它将被使用)。
现在假设在您的库的一个早期版本中,您使用了一些内联声明但实际上没有内联的函数(例如,递归函数)。其他人出现并开始使用您的图书馆。在以后的版本中,您重新编写代码以删除递归;突然编译器可以内联函数并选择,因此隐藏了导出。现在,您现有的客户(无论谁使用您的图书馆)都缺少符号。你破坏了二进制兼容性。