总是内联的函数不同.so
问题描述:
在Linux中,如果我在动态库中声明一个函数为__attribute__((always_inline))
,然后我动态加载该库,那么该函数是否将由动态链接程序内联,并使用gcc
?总是内联的函数不同.so
我编译动态库,在-O3
并没有经过任何链接时优化标志-flto
真正的问题是:是在一个动态库,值得声明的函数总是内联,当它被称为大部分的时间从另一个图书馆?
答
glibc的动态连接器将不会内联在它加载的对象中发现的任何功能。
但是,如果声明并定义在头文件中的always_inline
功能,编译将内联函数,即使有一个DSO的实现。这有两个后果:
您可以获得内联的速度优势。
所有的函数定义的信息已经被编译进调用者,所以它可能不再有可能与不同的实现来替换DSO。
换句话说,它可能要快一点,但是提供ABI兼容性突然难得多。
因此,无论这是值得做的事情真的取决于性能需求和什么样的给你希望图书馆未来的变化。
的感谢!理想情况下,我应该并且会转向静态地链接整个项目,但不幸的是,目前这不是一件容易的事情。 我没有得到任何动态库的好处,并为它付出代价。 –