c++ - 始终在不同的 .so 中内联函数

标签 c++ gcc dll shared-libraries link-time-optimization

在 Linux 中,使用 gcc 如果我在动态库中声明一个函数为 __attribute__((always_inline)) 然后我动态加载该库,该函数将是由动态链接器内联?

我正在编译动态库,在 -O3 中并且没有传递任何链接时间优化标志 -flto

真正的问题是:在动态库中将一个函数声明为始终内联是否值得,因为它大部分时间都是从另一个库中调用的?

最佳答案

glibc 动态链接器不会内联在它加载的对象中找到的任何函数。

但是,如果您在头文件中声明并定义 always_inline 函数,编译器 将内联该函数,即使有DSO 中的实现。这有两个后果:

  • 您可以获得内联的速度优势。

  • 函数定义中的所有信息都已编译到调用者中,因此可能无法再用不同的实现替换 DSO。

换句话说,它可能会快一点,但提供 ABI 兼容性突然变得更加困难。

所以这是否值得做实际上取决于性能需求以及您期望库在未来发生什么样的变化。

关于c++ - 始终在不同的 .so 中内联函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45298429/

相关文章:

C++ 条件运算符在全局函数中使用时无法正常工作

c++ - 静态或动态类型用于 "sizeof expr"?

c++ - double 需要多长时间才能在 12 个字节中容纳这么多字符?

c++ - 如何定义自定义 Mac OS X 框架/动态库的可选入口点?

c++ - const 关键字的默认数据类型是 int 类型?

C++ 将函数模板实例化为类成员并使用 "this"指针

gcc - 一站式完成GCC预处理器输出和编译

c++ - 预期的类型说明符错误 gcc

java - 与java应用程序的接口(interface)DLL,如何?

windows - 为什么 dependency walker 将 32 位 dll 显示为 64 位?