首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内联函数性能

内联函数性能
EN

Stack Overflow用户
提问于 2011-04-27 13:09:12
回答 2查看 2.1K关注 0票数 2

我在使用内联函数时遇到了轻微的性能问题。考虑以下代码:

代码语言:javascript
复制
inline int left(int x) {
    return 2*x;
}
inline int right(int x) {
    return 2*x+1;
}

main() {
    for(int i=0;i<200000000;i++) {
        int L=left(i);
        int R=right(i);
    }
}

在我的计算机上,当编译和执行时(带和不带-finline-function标志)大约需要1.90秒。然而,当我用宏替换内联函数时,它只需要1.26秒。虽然一个函数被执行两亿次的可能性很小,但我仍然想知道是否有使用内联函数来实现这种性能的方法?

编辑:在收到一些攻击性的评论后,我意识到我的问题不是很清楚。我只想知道如何在不使用任何优化标志的情况下实现相同的性能。当然,简单地使用-O2或-O3更明智,我只是想学习一下。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-27 13:22:44

内联函数和宏应具有相同的性能,因此您的函数可能不会内联。尝试添加

__attribute__((always_inline))

添加到函数声明中。(另请参阅gcc文档here):

通常,除非指定了优化,否则函数不会内联。对于内联声明的函数,即使未指定优化级别,此属性也会内联函数。

票数 13
EN

Stack Overflow用户

发布于 2011-04-27 13:19:29

对我来说,使用-O3优化的GCC 4.2.1,内联函数和宏在运行时没有区别。这两种情况都是0.185秒,我严重怀疑我的笔记本电脑比你的机器快10倍。

运行g++ -S进一步表明目标代码是相同的。

我确实将int Lint R调整为volatile int,以强制它实际执行循环。

编辑:降低优化设置的目的是为了帮助调试。内联函数在-O0中可能较慢的原因之一是,编译器确保所有变量都处于一致的状态,以便您可以在调试器中的内联函数中的代码行处停下来查看。

有时优化使得不可能突破内联函数或单步执行内联函数,就像宏一样。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5799626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档