1

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

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

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

4

1 回答 1

4

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

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

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

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

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

所以这是否值得做真的取决于性能需求以及你期望的库未来会发生什么样的变化。

于 2017-07-25T09:11:57.100 回答