内联函数性能

时间:2011-04-27 05:09:12

标签: c++ performance function inline

我对内联函数有轻微的性能问题。 请考虑以下代码: -

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秒。 虽然函数执行2亿次的可能性很小,但我仍然想知道是否有使用内联函数来实现这种性能?

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

2 个答案:

答案 0 :(得分:13)

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

  

__attribute__((always_inline))

到你的函数声明。 (另请参阅gcc docs here):

  

通常,函数不是内联的   除非指定了优化。对于   函数声明为内联,这个   属性内联函数即使   没有指定优化级别。

答案 1 :(得分:10)

对我来说,在-O3优化的GCC 4.2.1中,内联函数和宏之间的运行时没有区别。在任何一种情况下它都是0.185秒,我非常怀疑我的笔记本电脑比你的机器快10倍。

运行g++ -S进一步显示目标代码相同。

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

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

有时候,优化会使内部函数无法破解或逐步执行内联函数,就像宏一样。