【问题标题】:always inline functions in different .so总是在不同的.so中内联函数
【发布时间】:2017-07-25 08:55:27
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 谢谢!理想情况下,我应该并且会转向静态链接整个项目,但不幸的是,目前这不是一件容易的事。我没有从拥有动态库中获得任何好处,并为此付出代价。
    猜你喜欢
    • 2015-10-27
    • 2017-01-05
    • 2018-12-09
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    相关资源
    最近更新 更多