【问题标题】:Inlining functions from a separate file in GCC从 GCC 中的单独文件内联函数
【发布时间】:2011-10-19 03:57:17
【问题描述】:

我的项目中有一个紧密的内部循环,它调用了一些辅助函数。为了获得最佳性能,这些简单的函数声明为:

BOOL isValidPoint(CGPoint point) __attribute__((always_inline));

在我的 ImageCommon.h 文件中,并实现为:

inline BOOL isValidPoint(CGPoint point);

在 ImageCommon.m 中。换句话说,我总是希望这些函数内联。

如果我从 ImageCommon.m 中的其他函数调用 isValidPoint,反汇编输出确认对 isValidPoint 的函数调用已被清除。但是,如果我从另一个源文件调用此函数,则该函数调用将保留在原处 - 它不是内联的。

是否可以内联在一个实现文件中调用但在另一个实现文件中定义的函数?

【问题讨论】:

    标签: objective-c c gcc inline


    【解决方案1】:

    尝试将其声明为“静态内联”,而不仅仅是“内联”。然后编译器会将其视为翻译单元的本地,并且应该确定它确实可以内联。

    编辑:抱歉,我没有看到您在翻译单元中定义了这个函数。该定义还需要使用“静态内联”移动到 .h 才能工作。

    【讨论】:

      【解决方案2】:

      如果您希望将您的函数内联到其他编译单元中,则该函数的定义需要对这些编译单元可见(即,它需要在标头中)。

      或者,您也可以利用链接时优化来胡闹,具体取决于您使用的编译器。

      【讨论】:

        【解决方案3】:

        我的回答是,您是否遵循 90:10 优化规则。基本上 90% 的程序员知道要优化什么,所以他们有 10% 的机会猜测他们需要优化的 10% 的代码(抄袭其他规则)

        基本上不要内联任何东西——让编译器来做

        【讨论】:

        • 我已经完成了广泛的分析。内联这些函数是绝对值得的,编译器不会自己做。
        • 你是如何进行分析的?您是否正在使用整个程序优化,您是否使用概要文件进行编译并使用概要文件数据重新编译以帮助优化器发生了什么?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-17
        • 2014-12-17
        • 2023-03-30
        • 1970-01-01
        • 1970-01-01
        • 2018-08-17
        • 2020-11-25
        相关资源
        最近更新 更多