【问题标题】:How can I tell if "inline" worked?如何判断“内联”是否有效?
【发布时间】:2014-07-10 19:35:57
【问题描述】:

我有一个需要加速的工作应用程序。我设置了分析(有关详细信息,请参阅here),它似乎报告了每个函数需要多少时间。我找不到任何方法来发现函数的不同子部分所消耗的时间。

然后我在一些经常访问的小函数的声明中插入了关键字“inline”,希望得到一些加速。但是当我再次分析时,我看到了相同的函数列表,包括我内联的函数。这让我怀疑是否刚刚忽略了 inline 关键字。

我有一个模糊的回忆,对于某些编译器,inline 关键字是编译器可以选择忽略的东西,具体取决于可用内存量等因素。

那么我可以做一些检查来确认“内联”关键字是否真的完成了它的工作?

【问题讨论】:

    标签: android c++ android-ndk


    【解决方案1】:

    你可以试试:

    • 检查编译器的程序集或机器代码输出(无论是反汇编还是仅使用 nm 或任何 android 具有的函数符号检查),或使用调试器单步执行

    • 使用编译器编译指示/属性强制内联(如果可用,例如 GCC has a function attribute always_inline),如果您的分析结果不受影响,那么可能编译器已经内联

    • 检查您的分析文档以确保您正在执行的分析不会抑制内联

    正如您所记得的,inline(以及在其类中定义的隐式内联的成员函数)只是对编译器的提示。有些人认为它们只是管理单一定义规则问题的便捷方法,但您必须检查各个 C++ 编译器的代码,以查看关键字是否真的 没有意义。编译器可能会使用各种指标来计算何时内联,包括影响的优化标志、外联函数的大小、函数调用次数(例如,如果只有一个,为什么不内联甚至是一个大函数?)等等。

    【讨论】:

    • 添加 always_inline 使函数名称从配置文件报告中消失。这足以证明对我来说它以前不是内联的,现在是:-)
    • @Mick:很酷 - 但百万美元的问题是......它更快吗? :-)
    • 我想是的,但我一直在为这个问题而烦恼:stackoverflow.com/questions/24631535/…
    • @Mick:听起来很棘手...... 20% 相当可观。我对android或OpenCV一无所知,所以希望其他人能帮助你。干杯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 2021-11-06
    • 2019-05-27
    • 1970-01-01
    • 2021-01-11
    相关资源
    最近更新 更多