gpt4 book ai didi

c++ - 内联如何限制升级版本的二进制兼容性

转载 作者:行者123 更新时间:2023-11-28 00:19:48 25 4
gpt4 key购买 nike

我知道过度使用内联函数会影响二进制可升级性。当可升级性很重要时,必须避免这种情况。但是,我无法弄清楚内联如何影响二进制兼容性。请有人说明这一点。

最佳答案

在声明您的函数、变量和类型(又名“符号”)时,您还应该将它们声明为导出的。不同的编译器以不同的方式实现这一点( Visual Studio uses __declspec(dllexport) (以及其他一些我懒得为你谷歌的方法)而 GCC uses various Visibility switches 。我相信 clang 使用 GCC 语义(或相对兼容)并且不熟悉其他编译器' 导出符号的方法。

如果你内联你的函数并且它实际上被内联(如果你将它声明为可导出符号,我认为这是一个编译器错误)那么你如何从外部调用它你的图书馆?作为函数内联过程的一部分,编译器通常会删除或重写序言和结尾指令,因为它们不再需要(例如,在 x86 上不再需要 retn——只需存储返回值它将被使用的寄存器中的值)。

现在假设在您的库的一个早期版本中,您使用了一些被声明为内联但实际上并没有内联的函数(例如,递归函数)。其他人出现并开始使用您的图书馆。在以后的版本中,您重新编写代码以删除递归;突然之间,编译器可以内联函数并选择这样做,因此隐藏了导出。现在您现有的客户(无论谁在使用您的图书馆)都缺少符号。你破坏了二进制兼容性。

关于c++ - 内联如何限制升级版本的二进制兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28071771/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com