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