在 Linux 中,使用gcc
如果我将动态库中的函数声明为__attribute__((always_inline))
,然后动态加载该库,该函数是否会由动态链接器内联?
我正在编译动态库,-O3
并且没有传递任何链接时间优化标志-flto
真正的问题是:当大多数时候从另一个库调用函数时,是否值得在动态库中始终内联声明函数?
glibc 动态链接器不会内联在其加载的对象中找到的任何函数。
但是,如果在头文件中声明并定义always_inline
函数,编译器将内联该函数,即使 DSO 中有实现也是如此。 这有两个后果:
-
您可以获得内联的速度优势。
-
函数定义中的所有信息都已编译到调用方中,因此可能无法再用不同的实现替换 DSO。
换句话说,它可能更快一些,但提供 ABI 兼容性突然变得更加困难。
因此,这是否值得这样做实际上取决于性能需求以及您期望的库未来发生什么样的变化。