关于C++内联函数的几个问题

Jam*_*ard 4 c++ inline

我上课的培训材料似乎是两个相互矛盾的陈述.

一方面:

"使用内联函数通常可以更快地执行"

另一方面:

"使用内联函数可能会因更频繁的交换而降低性能"

问题1:这两个陈述都是正确的吗?

问题2:这里"交换"是什么意思?

请看一下这个片段:

int powA(int a, int b) {
  return (a + b)*(a + b) ;
}

inline int powB(int a, int b) {
  return (a + b)*(a + b) ;
}

int main () {
    Timer *t = new Timer;

    for(int a = 0; a < 9000; ++a) {
        for(int b = 0; b < 9000; ++b) {
             int i = (a + b)*(a + b);       //              322 ms   <-----
            //  int i = powA(a, b);         // not inline : 450 ms
            //  int i = powB(a, b);         // inline :     469 ms
        }
    }

    double d = t->ms();
    cout << "-->  " << d << endl; 

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

问题3:为什么表现powApowB?之间的表现如此相似?我预计powB性能将达到322毫秒,因为它毕竟是内联的.

Gre*_*ill 5

问题1

是的,在特定情况下,这两种说法都是正确的.显然,他们不会都成为真正的在同一时间.

问题2

"交换"可能是对OS分页行为的引用,当内存压力变高时,页面将被换出到磁盘.

实际上,如果您的内联函数很小,那么由于消除了函数调用和返回的开销,您通常会注意到性能的提高.但是,在非常罕见的情况下,您可能会导致代码增长,使其无法完全驻留在CPU缓存中(在性能关键的紧密循环期间),并且您可能会遇到性能下降的问题.但是,如果您在该级别进行编码,那么您可能应该直接使用汇编语言进行编码.

问题3

inline改性剂是一种暗示来,它可能要考虑编译给定函数内联的编译器.它不必遵循您的指示,结果也可能取决于给定的编译器选项.您始终可以查看生成的汇编代码以了解其执行的操作.

你的基准测试可能甚至没有做你想做的事情,因为你的编译器可能足够聪明,甚至没有使用你指定的函数调用的结果i,所以它甚至可能不会打扰你的函数.再看一下生成的汇编代码.

  • @James - 确认的唯一方法是检查生成的汇编代码. (2认同)